• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

iOS - 父/ subview 的 Quartz 绘图问题

[复制链接]
菜鸟教程小白 发表于 2022-12-13 13:34:16 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

场景

我有两种观点。一种是“父” View ,其中包含一个“子” View ,用于绘图。我在后面的代码中将 child 称为 QuartzView。 QuartzView 知道如何根据自己的上下文绘制正方形。

问题

当我告诉它的 self 上的 QuartzView 绘制一个正方形时,它会按预期进行。当我使用父 View 告诉 QuartsView 在它的 self 上绘制一个正方形时,它会在屏幕左下角以预期大小的 1/5 左右绘制正方形。

问题

我认为这里存在一些父/子或上下文问题,但我不确定它们是什么。如何让两个正方形以完全相同的大小在完全相同的位置绘制?

ViewController

- (void)drawASquare {

    // this code draws the "goofy" square that is smaller and off in the bottom left corner
    x = qv.frame.size.width / 2;
    y = qv.frame.size.height / 2;
    CGPoint center = CGPointMake(x, y);
    [qv drawRectWithCenter:center andWidth:50 andHeight:50 andFillColor:[UIColor blueColor]];

}

QuartzView

- (void)drawRectCGRect)rect
{
    self.context = UIGraphicsGetCurrentContext();
    UIColor *color = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.5];

    // this code draws a square as expected
    float w = self.frame.size.width / 2;
    float h = self.frame.size.height / 2;
    color = [UIColor blueColor];
    CGPoint center = CGPointMake(w, h);
    [self drawRectWithCenter:center andWidth:20 andHeight:20 andFillColor:color];
}

- (void)drawRectWithCenterCGPoint)center andWidthfloat)w andHeightfloat)h andFillColorUIColor *)color
{
    CGContextSetFillColorWithColor(self.context, color.CGColor);
    CGContextSetRGBStrokeColor(self.context, 0.0, 1.0, 0.0, 1);

    CGRect rectangle = CGRectMake(center.x - w / 2, center.x - w / 2, w, h);

    CGContextFillRect(self.context, rectangle);
    CGContextStrokeRect(self.context, rectangle);
}

注意

  • 两个正方形的不透明度相同
  • 我关闭了“自动调整 subview 大小”,但没有明显区别
  • view.contentScaleFactor = [[UIScreen mainScreen] scale]; 没有帮助

编辑

我注意到从左下角开始绘制父级时正方形的 x/y 值是 0,0,而通常 0,0 是左上角。



Best Answer-推荐答案


UIGraphicsGetCurrentContext() 的返回值仅在 drawRect 方法内有效。您不能也不得在任何其他方法中使用该上下文。所以 self.context 属性应该只是一个局部变量。

drawRectWithCenter 方法中,您应该将所有参数存储在属性中,然后使用 [self setNeedsDisplay] 请求 View 更新。这样,框架将使用新信息调用 drawRectdrawRectWithCenter 方法应该是这样的

- (void)drawRectWithCenterCGPoint)center andWidthfloat)w andHeightfloat)h andFillColorUIColor *)color
{
    self.showCenter = center;
    self.showWidth = w;
    self.showHeight = h;
    self.showFillColor = color;
    [self setNeedsDisplay];
}

当然,drawRect 函数需要获取该信息,并进行适当的绘图。

关于iOS - 父/ subview 的 Quartz 绘图问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37353312/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap