【发布时间】:2011-10-15 01:14:13
【问题描述】:
对于任何使用 Core Animation 图层支持视图的项目的人来说,很遗憾,对于未在预设不透明背景上渲染的文本,亚像素抗锯齿(文本平滑)被禁用是很明显的。现在,对于能够为其文本设置不透明背景的人(使用setBackgroundColor: 调用或Interface Builder 中的等效设置),此问题不会造成太大问题。但是对于其他人来说,他们完全没有办法解决它,这不是一个可以忽视的事情。
我已经在网上寻找了两天多的解决方案,但没有找到任何可用的解决方案。我要做的就是创建一个在工作表窗口上设置的文本标签(用户不可编辑)(工作表窗口背景是透明的,因此让工作表的内容视图将 wantsLayer 声明为 true 会禁用所有标签上的文本平滑窗户);很简单的事情。我见过很多有争议的解决方案(快速的谷歌搜索会在许多其他地方提出这个话题),但到目前为止,所有这些解决方案都依赖于人们能够并且愿意与不透明的背景妥协(你不能在一张纸上使用)。
到目前为止,我能想象到的最佳方向是将文本与文本平滑预渲染到图像上,然后像往常一样在图层支持的视图上显示图像。然而,这似乎是不可能的。我认为人们会尝试的“正常”方式是这样的:
NSAttributedString *string = [[self cell] attributedStringValue];
NSImage *textImage = [[NSImage alloc] initWithSize:[string size]];
[textImage lockFocus];
[string drawAtPoint:NSZeroPoint];
[textImage unlockFocus];
但这似乎不起作用(很可能是因为从drawRect: 调用时,设置的图形上下文已经禁用了文本平滑 - 亚像素抗锯齿已关闭,而是使用常规抗锯齿),但两者都没有在this question(您可以在其中创建自己的图形上下文)中找到更复杂的解决方案。
那么怎么可能做这样的事情呢?你能以某种方式“伪造”文本平滑的效果吗?是否有甚至可以设置某些东西的hack-ish解决方法?我真的不想因为这个愚蠢的问题而放弃 Core Animation;它有很多好处,可以节省大量时间和代码。
编辑:经过大量搜索,我找到了一些东西。虽然thread itself 只是重申了我的怀疑,但我想我可能已经找到了解决问题的方法:自定义CALayer 绘图。 Timothy Wood 在他的一个回复中附上了一个示例项目,该项目显示了使用多种技术进行字体平滑化,其中一些技术有效。我会考虑将其集成到我的项目中。
编辑#2:原来,上面的链接也是一个半身像。虽然链接的方法提供了亚像素抗锯齿,但它们在透明背景上也失败了。
【问题讨论】:
-
不确定这是否是一个答案,所以发表评论。你检查过核心文本吗?这是一个随机的核心文本示例:pastie.org/2249243。它确实 drawRect 级别的文本绘图,具有抗锯齿和所有爵士乐。老实说,我不确定这如何与 CALayer 融合。
-
我很确定 CoreText 与任何其他文本都存在同样的问题,不是吗?或者,至少,这是我一直相信的。
-
我想当 Core Text 绘制到 CALayer 时,它最终会变成 rgba 像素。 IE。它是文本还是其他什么都没有关系,因为它是光栅化的。但现在我只是猜测。
-
这就是问题所在。对于文本平滑,您需要绘制 ARAGAB 像素(即每种颜色都有自己的 alpha 值),这 CALayers 似乎无法处理...
标签: objective-c cocoa text core-animation antialiasing