当前位置:  开发笔记 > 前端 > 正文

在CGContext中绘制NSAttributedString时看起来很难看

如何解决《在CGContext中绘制NSAttributedString时看起来很难看》经验,为你挑选了1个好方法。

我想显示内部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

我缺少什么?



1> orestis..:

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

由于CALayer无法表示子像素颜色(也就是字体平滑),因此需要禁用它.我相信CATextLayer默认会这样做.

做CGContextSetShouldSmoothFonts(context,false).

谢谢,Aki!

Milen Dzhumerov的另一个评论:

我不相信这是准确的.我们使用亚像素消除锯齿将文本绘制到CALayers中.在绘制文本本身之前,您必须确保在文本后面绘制.有关参考,请参见http://www.cocoabuilder.com/archive/message/cocoa/2008/3/28/202581.

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

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

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


透明层怎么样?你应该有平滑的字体吗?
推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有