Ios CALayer和UIView上的差异绘图

Ios CALayer和UIView上的差异绘图,ios,core-graphics,calayer,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); { CGCont

我有一个组件,它有一个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方法中。使用相同的代码,圆看起来不太好,边界上有一些“像素化”


关于可能发生的事情有什么线索吗?提前感谢。

这是由于
contentsCale
属性造成的。当您有自定义CALayer时,此属性的默认值为1.0

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

如果您有一个视网膜设备,并且在绘制时将
contentsCale
设置为1.0,它将产生您描述的像素化外观。为了解决这个问题,你应该将图层的
contentsCale
设置为屏幕的一个

[self.layer设置内容缩放:[[UIScreen mainScreen]缩放]

当您在
UIView
drawRect
方法中绘制圆时,不会发生此问题,因为默认的
contentsCalefactor
已经是屏幕上的一个

对于实现自定义drawRect:method且关联 对于窗口,此特性的默认值为比例因子 与当前显示视图的屏幕关联