gpt4 book ai didi

cocoa - 在 CGContext 中绘制 NSAttributedString 时文本看起来很丑

转载 作者:行者123 更新时间:2023-12-03 16:04:37 24 4
gpt4 key购买 nike

我想在 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 版本:

这是 NSLayoutManager 版本:

我缺少什么吗?

最佳答案

我回答这个问题是因为 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).

谢谢,阿基!

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 http://www.cocoabuilder.com/archive/message/cocoa/2008/3/28/202581 for references.

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

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

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

关于cocoa - 在 CGContext 中绘制 NSAttributedString 时文本看起来很丑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/715750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com