2013-07-24 52 views
3

我有一个组件,它有一个UIView子类和一个自定义的CAlayer。CALayer和UIView的差异图

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

任何可能发生的线索的线索?提前致谢。

回答

3

这是由于contentsScale属性。当你有一个自定义的CALayer时,这个属性的默认值是1.0。

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

如果你有一个视网膜设备,你用contentsScale设置为1.0绘制,它会导致你描述的像素化的外观。为了解决这个问题,你应该将图层的contentsScale设置为屏幕的其中一个。

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

当你画的圆圈在UIViewdrawRect方法,因为有默认contentsScaleFactor已经是屏幕的一个,此问题不会发生。

对于意见认为实现自定义drawRect:方法和相关联 具有窗口,该属性的缺省值是与屏幕当前显示的视图相关联的比例因子 。 Source.