CALayer和UIView上的差异绘图

时间:2013-07-24 14:54:22

标签: ios core-graphics calayer

我有一个组件,它有一个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 个答案:

答案 0 :(得分:3)

这是由contentsScale属性引起的。如果您有自定义CALayer,则此属性的默认值为1.0。

  

此属性的默认值为1.0。对于附加到的图层   在视图中,视图会自动将比例因子更改为该值   适用于当前屏幕。对于您创建的图层和   管理自己,您必须自己设置此属性的值   根据屏幕的分辨率和您的内容   提供。核心动画使用您指定的值作为提示   确定如何呈现您的内容。 Source.

如果您有一个视网膜设备,并且您将contentsScale设置为1.0,则会产生您描述的像素化外观。为了解决这个问题,您应该将图层的contentsScale设置为屏幕之一。

[self.layer setContentsScale:[[UIScreen mainScreen] scale]];

当您使用drawRect UIView方法绘制圆圈时,不会发生此问题,因为默认contentsScaleFactor已经是屏幕之一。

  

对于实现自定义drawRect:方法且已关联的视图   使用窗口,此属性的默认值是比例因子   与当前显示视图的屏幕相关联。 Source.