CALayer和UIView上的区别图
Posted
技术标签:
【中文标题】CALayer和UIView上的区别图【英文标题】:Difference drawing on CALayer and UIView 【发布时间】:2013-07-24 14:54:22 【问题描述】:我有一个包含 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】:这是由于 contentsScale
属性。当您有自定义 CALayer 时,此属性的默认值为 1.0。
此属性的默认值为 1.0。对于附加到 视图,视图会自动将比例因子更改为一个值 适合当前屏幕。对于您创建的图层和 自己管理,必须自己设置这个属性的值 基于屏幕的分辨率和您的内容 提供。 Core Animation 使用你指定的值作为提示 确定如何呈现您的内容。 Source.
如果您有一个 Retina 设备并且您将contentsScale
设置为 1.0 进行绘制,它将导致您所描述的像素化外观。为了解决这个问题,您应该将图层的contentsScale
设置为屏幕之一。
[self.layer setContentsScale:[[UIScreen mainScreen] scale]];
当您在UIView
的drawRect
方法中绘制圆圈时不会发生此问题,因为默认的contentsScaleFactor
已经是屏幕之一。
对于实现自定义 drawRect: 方法并关联的视图 带窗口时,此属性的默认值为比例因子 与当前显示视图的屏幕相关联。 Source.
【讨论】:
以上是关于CALayer和UIView上的区别图的主要内容,如果未能解决你的问题,请参考以下文章