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 方法中。使用相同的代码,圆圈看起来不太好,并且在边框上有一些“像素化”。

关于可能发生什么的任何线索?提前致谢。

4

1 回答 1

4

这是由于contentsScale财产。当您有自定义 CALayer 时,此属性的默认值为 1.0。

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

如果您有一个视网膜设备并且您使用contentsScale设置为 1.0 进行绘制,它将导致您描述的像素化外观。为了解决这个问题,您应该将图层设置contentsScale为屏幕之一。

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

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

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

于 2013-09-26T10:03:45.277 回答