CALayer的抗锯齿效果不如UIView的抗锯齿效果

19
我一直在尝试使用CALayer动画绘制圆形。虽然一切都正常工作,但问题是——绘制的圆形边缘不够抗锯齿,有点粗糙(或者如果使用了光栅化,则变得模糊)。(已启用抗锯齿)
也尝试过:
``` edgeAntialiasingMask = kCALayerLeftEdge | kCALayerRightEdge | kCALayerBottomEdge | kCALayerTopEdge; ```
但没有效果。
下面是没有进行光栅化时的示例图像: enter image description here 下面是进行了光栅化处理的示例图像(尝试了从1.0到4.0的值(只是为了确保)。结果相同): enter image description here 下面是相同的圆,但是在UIView drawrect中绘制: enter image description here 你可以看出,使用UIView drawrect绘制的圆看起来好得多。
我不能使用UIView的原因是因为我需要动画填充圆。使用CALayer非常容易,但要在UIView上做同样的事情,我真的不知道是否可能。(我可以尝试每隔1/60秒启动一次drawrect:,但我认为它会变得卡顿,因为它不是打算这样使用的。)
所以——是否有人有任何解决方案,可以让在CALayer上绘制的圆/线看起来与在UIView上绘制的相同?

注意:默认情况下,edgeAntialiasingMask在所有边缘上都是启用的,因此您的代码不应该有任何影响。但是,将其设置为= 0;可能会产生影响(对图像的边缘)。 - Albert Renshaw
1个回答

47

以前我在Retina设备上使用CALayer进行像素绘制时遇到了问题。(我假设您在Retina设备上看到了这个问题)按照以下方式修复了我遇到的问题:

layer.contentsScale = [[UIScreen mainScreen] scale];

你不需要处理栅格化或抗锯齿。在我的代码中,我最初实现了将某些内容绘制到 UIView 上,后来改为在 CALayer 中绘制,仅仅设置 contentsScale 属性使得两者的绘制效果相同。


4
天啊,我简直不敢相信我错过了这个。它有效!!!谢谢你!!!你让我的一天变得美好 :) - Guntis Treulands
你需要在绘制圆之前设置contentsScale吗?还是无所谓的?谢谢! - Crashalot
1
很奇怪,当我从视图中设置它时,它只对我有效,但如果我在CALayer子类中设置它,则无效。 - Zoltán

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接