我的应用在NSImageView
上绘制了支持图层的标签
图像视图显示图像,并在该图像上显示色调。
这可确保标签和背景图像之间的对比度有效。
如您所见,亚像素抗锯齿功能已启用且工作正常。
当您将鼠标悬停在这些标签上时,它们会为frame
属性设置动画(实际上是包含它们的视图)。
在动画制作时,子像素抗锯齿功能被禁用,并在再次启用时启用。
这看起来非常奇怪。
永远不会重绘图层,并且子像素抗锯齿不必更改 所以我没有看到为什么在制作动画时不应该显示的原因。
我已经尝试了我能想到的一切。
NSTextField
不透明CATextLayer
不透明NSTextField
背景色CATextLayer
背景色总是一样的结果。
禁用标签的子像素抗锯齿不是一种选择,因为它在非视网膜设备上不易读取。
我忘了在制作动画时图层被presentationLayer
替换
该层可能不支持子像素抗锯齿,这就是它被禁用的原因。
现在问题是我是否可以用presentationLayer
替换此CATextLayer
。
我还注意到,将shouldRasterize
设置为YES
也启用了子像素抗锯齿功能,但动画只能用于背景颜色。因此,没有背景颜色不会带来子像素抗锯齿。
答案 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);
你可能认为应该把文字画得清晰。但是,位置点位于图层的中心,根据图层的宽度和高度,左边和上边的坐标可能是小数。
如果您想快速测试,请执行此操作。
textLayer.frame = frame
代替使用位置和定位点,它会将坐标直接指定给框架。如果这样可以使文本清晰,您可以开始使用锚点和位置,并查看结果如何变化。