具有不透明背景的CALayer中的文本抗锯齿

时间:2012-02-16 16:23:00

标签: objective-c macos core-animation

正如其他人所做的那样,我正试图在CALayer支持的视图上获得体面的文字。我找到的最相关的帖子是Faking Subpixel Antialiasing on Text with Core Animation

在该帖子的开头,它声明“现在,对于能够为其文本设置不透明背景的人(使用setBackgroundColor:call或Interface Builder中的等效设置),此问题不会出现太麻烦了。“但是,当我在IB中设置文本框的背景,并让它绘制背景,并对其单元格执行相同操作时,我仍然遇到相同的问题(使用图层时没有抗锯齿)。这些属于NSBox,也是它的背景。

关于我应该做什么的任何想法,我不是吗?感谢

2 个答案:

答案 0 :(得分:3)

不确定这是否有助于解决您的问题,但是当您在图层中进行自定义绘图时,您必须使用具有不透明颜色的CGContextFillRect(),然后在该矩形顶部绘制字符串以获得子像素antaialiasing。

设置layer.backgroundColor还不够好,可能是因为可以在不重新绘制图层内容的情况下更改layer.backgroundColor。

答案 1 :(得分:0)

如果你只是想在不透明的背景上看到清晰的文字并用CATextLayer撞到墙上 - 放弃并使用NSTextField,禁用inset并将linefragmentpadding设置为0.示例代码很快,但你应该是能够轻松翻译......

var testV = NSTextView()
testV.backgroundColor = NSColor(calibratedRed: 0.73, green: 0.84, blue: 0.89, alpha: 1)
testV.frame = CGRectMake(120.0, 100.0, 200.0, 30.0)
testV.string = "Hello World!"
testV.textContainerInset = NSZeroSize
testV.textContainer!.lineFragmentPadding = 0
self.addSubview(testV)

对我来说显示相当于的文字:

var testL = CATextLayer()
testL.backgroundColor = NSColor(calibratedRed: 0.73, green: 0.84, blue: 0.89, alpha: 1).CGColor
testL.bounds = CGRectMake(0.0, 0.0, 200.0, 30.0)
testL.position = CGPointMake(100.0, 100.0)
testL.string = "Hello World!"
testL.fontSize = 14
testL.foregroundColor = NSColor.blackColor().CGColor
self.layer!.addSublayer(testL)