在CALayer和UIView上绘制的区别

3

我有一个组件,其中包含一个UIView子类和一个自定义的CAlayer。

在UIView中,有一个使用CoreGraphics绘制的圆形,代码如下:

CGRect b = self.bounds;

int strokeSize = 2;
CGRect arcBounds = CGRectMake(b.origin.x+1, b.origin.y+1, b.size.width-2, b.size.height-2);

CGContextSaveGState(ctx); {     
    CGContextSetLineWidth(ctx, strokeSize);
    CGContextSetStrokeColorWithColor(ctx, [UIColor lightGrayColor].CGColor);
    CGContextStrokeEllipseInRect(ctx, arcBounds);
} CGContextRestoreGState(ctx);

当我在UIView的drawRect方法中绘制圆圈时,它完美地工作,圆圈被平滑地绘制出来,看起来很棒。

问题出现在当我在这个圆圈上再画另一个圆圈时,但第二个圆圈是在CALayer中绘制的,实际上是在我的自定义CALayer的drawInContext方法中绘制的。使用完全相同的代码,圆圈看起来不好,并且边缘有一些“像素化”。

有什么线索可以解决这个问题吗?提前致谢。

1个回答

4
这是由于contentsScale属性导致的。当您有自定义的CALayer时,该属性的默认值为1.0。
引用块中提到:“此属性的默认值为1.0。对于附加到视图的图层,视图会自动更改比例因子以适合当前屏幕。对于您创建和管理的图层,您必须根据屏幕分辨率和提供的内容自己设置此属性的值。核心动画使用您指定的值作为提示来确定如何呈现您的内容。来源。
如果您有一个retina设备,并且将contentsScale设置为1.0进行绘制,那么它将导致您描述的那种像素化外观。为了解决这个问题,您应该将层的contentsScale设置为屏幕的比例之一。 [self.layer setContentsScale:[[UIScreen mainScreen] scale]]; 这个问题不会在你的UIViewdrawRect方法中绘制圆时发生,因为那里默认的contentsScaleFactor已经是屏幕的比例因子。对于实现自定义drawRect:方法并与窗口相关联的视图,此属性的默认值是与当前显示视图的屏幕相关联的比例因子。来源。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接