CATextLayer子像素抗锯齿

时间:2014-03-22 22:50:30

标签: objective-c macos cocoa core-animation

我的应用在NSImageView上绘制了支持图层的标签 图像视图显示图像,并在该图像上显示色调。

这可确保标签和背景图像之间的对比度有效。

enter image description here

如您所见,亚像素抗锯齿功能已启用且工作正常。

当您将鼠标悬停在这些标签上时,它们会为frame属性设置动画(实际上是包含它们的视图)。
在动画制作时,子像素抗锯齿功能被禁用,并在再次启用时启用。

enter image description here

这看起来非常奇怪。

永远不会重绘图层,并且子像素抗锯齿不必更改 所以我没有看到为什么在制作动画时不应该显示的原因。

我已经尝试了我能想到的一切。

  • 制作NSTextField不透明
  • 制作CATextLayer不透明
  • NSTextField背景色
  • CATextLayer背景色

总是一样的结果。

禁用标签的子像素抗锯齿不是一种选择,因为它在非视网膜设备上不易读取。


修改

我忘了在制作动画时图层被presentationLayer替换 该层可能不支持子像素抗锯齿,这就是它被禁用的原因。

现在问题是我是否可以用presentationLayer替换此CATextLayer

我还注意到,将shouldRasterize设置为YES也启用了子像素抗锯齿功能,但动画只能用于背景颜色。因此,没有背景颜色不会带来子像素抗锯齿。

2 个答案:

答案 0 :(得分:1)

有什么办法可以发布一段示例代码吗?我很快嘲笑了一个NSWindow,添加了一个NSImageView,在setWantsLayer中添加了一个无背景的NSTextField:设置为YES。在我的applicationDidFinishLaunching中:我在NSTextField的Animator框架上设置了一个新的rect,但我没有看到任何像素化。

答案 1 :(得分:0)

问题在于文本图层的定位。让我们假设您使用左对齐。如果图层的帧原点的x和y坐标是舍入数字,则文本看起来很好。例如:

CGFloat x = 10.6;
CGFloat y = 10.3;

textLayer.frame = CGRectMake(x, y, width, height); // the text will be blur.
textLayer.frame = CGRectMake(round(x), round(y), width, height); // the text will not be blur.

因此,第一个问题可能是您分配给图层框架的坐标未被舍入。 棘手的部分是,即使您认为通过圆角坐标,图层的边缘仍可能未与像素对齐。如果图层的anchorPoint为(0.5, 0.5),则可能会发生这种情况,这是默认值。如果你设置:

textLayer.position = CGPointMake(10.0, 10.0);

你可能认为应该把文字画得清晰。但是,位置点位于图层的中心,根据图层的宽度和高度,左边和上边的坐标可能是小数。

如果您想快速测试,请执行此操作。

  1. 使用textLayer.frame = frame代替使用位置和定位点,它会将坐标直接指定给框架。
  2. 确保您在框架中使用的数字是四舍五入的。
  3. 不要乱用渲染机制,删除更改应该更改的代码,抗锯齿等。
  4. 如果这样可以使文本清晰,您可以开始使用锚点和位置,并查看结果如何变化。