cocoa – 在CGContext中绘制NSAttributedString时看起来很难看的文本

我想在CoreAnimation图层中显示字符串,但遗憾的是CATextLayer是不够的,主要是因为在使用约束时你很难使用并且你想要包装文本.

我正在使用NSLayoutManager,使用以下代码(PyObjC):

NSGraphicsContext.saveGraphicsstate()

# THIS SOLVES THIS ISSUE
CGContextSetShouldSmoothFonts(ctx,False)

graphics = NSGraphicsContext.graphicsContextWithGraphicsPort_flipped_(ctx,True)
NSGraphicsContext.setCurrentContext_(graphics)

height = size.height
xform = NSAffineTransform.transform();
xform.translateXBy_yBy_(0.0,height)
xform.scaleXBy_yBy_(1.0,-1.0)
xform.concat()

self.textContainer.setContainerSize_(size)

glyphRange = self.layoutManager.glyphRangeForTextContainer_(self.textContainer)

self.layoutManager.drawBackgroundForGlyphRange_atPoint_(glyphRange,topLeft)
self.layoutManager.drawGlyphsForGlyphRange_atPoint_(glyphRange,topLeft)

NSGraphicsContext.restoreGraphicsstate()

这一切都很好并且有效,但唯一的问题是它会产生看起来很糟糕的文本(虽然它是防腐蚀的).

这是CATextLayer版本:http://i39.tinypic.com/23h0h1d.png

这是NSLayoutManager版本:http://i40.tinypic.com/2vv9rw5.png

我错过了什么?

解决方法

我正在回答这个问题,因为coretext-dev档案无法搜索,Apple的Aki Inoue刚回答了我的问题:

Since CALayer cannot represent subpixel color (aka font smoothing),you need to disable it.
I believe CATextLayer does it by default.

Do CGContextSetShouldSmoothFonts(context,false).

谢谢,Aki!

Milen Dzhumerov的另一个评论

I don’t believe this is accurate. We’re drawing text into CALayers with subpixel anti-aliasing. You just have to make sure that you’ve drawn behind the text before drawing the text itself. See 07000 for references.

Milen是正确的,如果你事先知道背景颜色,你可以这样做:

CGContextSetRGBFillColor(ctx,r,g,b,a)
CGContextFillRect(ctx,(topLeft,size))
CGContextSetShouldSmoothFonts(ctx,True)

你会得到漂亮的亚像素抗锯齿文本.但是,如果您不知道背景颜色,则需要关闭字体平滑,否则会出现乱码结果.

相关文章

Mip是什么意思以及作用有哪些
怎么测试Mip页面运行情况
MIP安装的具体步骤有哪些
HTML添加超链接、锚点的方法及作用详解(附视频)
MIP的规则有哪些
Mip轮播图组件中的重要属性讲解