【问题标题】:CALayer Antialiasing not as good as UIView antialiasingCALayer 抗锯齿不如 UIView 抗锯齿
【发布时间】:2014-02-18 23:44:10
【问题描述】:

我一直在尝试使用 CALayer 绘制圆形动画。这一切都很好,但问题是 - 绘制的圆圈没有足够的抗锯齿。它的边界有点太粗糙了,(如果使用光栅化,它会变得模糊)。 (启用抗锯齿)

也试过了:

edgeAntialiasingMask = kCALayerLeftEdge | kCALayerRightEdge | kCALayerBottomEdge | kCALayerTopEdge;

无济于事。

这是一个没有光栅化的例子:

这是一个光栅化示例:(尝试从 1.0 到 4.0 的值(只是为了确定。结果 - 相同。))

这里是同一个圆圈,但在 UIView drawrect 内部绘制:

您可以看到,使用 UIView drawrect 绘制的圆圈看起来好多了。

我不能使用 UIView 的原因是因为我需要动画圆形填充。使用 CALayer 真的很容易,但是在 UIView 上做同样的事情,我真的不知道它是否可能。 (我可以尝试启动 drawrect:每 1/60 秒,但我认为它会变得迟钝,因为它不是这样的)。

那么 - 有没有人有任何解决方案,如何让 CALayer 上绘制的圆/线看起来与 UIView 上绘制的一样?

【问题讨论】:

  • 注意:默认情况下,edgeAntialiasingMask 在所有边缘上启用,因此您的代码应该没有影响。但是,将其设置为 = 0; 可能会产生影响(在图像的边缘)

标签: ios objective-c uiview calayer


【解决方案1】:

我之前在 Retina 设备上的 CALayer 中遇到过像素化绘图问题。 (我假设您在 Retina 设备上看到了该问题)执行以下操作解决了我遇到的问题:

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

您不需要处理光栅化或抗锯齿。在我自己的代码中,我最初实现了在UIView 上绘制一些东西,后来我改为在CALayer 中绘制,只需设置contentsScale 属性即可使两者绘制相同。

【讨论】:

  • 天啊,我不敢相信我错过了这个。这行得通!!!!谢谢 !!!!你让我开心:)
  • 画圆前需要设置contentsScale还是没关系?谢谢!
  • 这太奇怪了,只有在从视图中设置它时才对我有用,但如果我在 CALayer 子类中设置它就不行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 2011-07-05
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多