我想在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)
你会得到漂亮的亚像素抗锯齿文本.但是,如果您不知道背景颜色,则需要关闭字体平滑,否则会出现乱码结果.