2012-02-16 106 views
5

正如其他人所做的那样,我试图在CALayer支持的视图上获得体面的文字。我找到的最相关的线程是Faking Subpixel Antialiasing on Text with Core Animation带有不透明背景的CALayer中的文字抗锯齿

在这篇文章的开始部分,它指出:“现在,对于能够为其文本设置不透明背景的人(无论是使用setBackgroundColor:call还是Interface Builder中的等效设置),此问题不会提出了太多的问题。“但是,当我在IB中设置文本框的背景并让它绘制背景并对其单元执行相同操作时,我仍然遇到同样的问题(使用图层时无反锯齿)。这些属于一个NSBox,也可以绘制它的背景。

任何想法,我应该做什么,我不是?谢谢

回答

3

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

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

+0

你有,你会如何绘制字符串,它不显示效果不佳的例子 - 我的尝试没有很好地呈现。 – Sam 2015-02-12 16:43:56

+0

@Sam确保将'layer.contentsScale'设置为'[UIScreen mainScreen] .scale'。 – 2015-02-14 01:54:58

+0

美丽。这工作完美。我一直将layer.backgroundColor设置为完全不透明的颜色,但在绘制文本之前我没有填充该颜色。一旦我做到了,文字就完美呈现了。谢谢! – Bryan 2016-03-18 04:52:10

0

如果您只是想在不透明的背景上看到清晰的文字并使用CATextLayer将您的头靠在墙上 - 放弃并使用NSTextField,并将插入禁用并将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)