Гадкий текст при рисовании NSAttributedString в CGContext - PullRequest
9 голосов
/ 04 апреля 2009

Я хочу отображать строки внутри слоев 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()

Это все нормально и работает, но единственная проблема заключается в том, что он создает плохо выглядящий текст (хотя он имеет *1009* сглаживание).

Вот версия CATextLayer:

А вот версия NSLayoutManager:

Что-нибудь, что мне не хватает?

1 Ответ

16 голосов
/ 04 апреля 2009

Я отвечаю на это, потому что архивы coretext-dev не доступны для поиска, и Аки Иноуэ из Apple только что ответил на мой вопрос:

Так как CALayer не может представлять субпиксельный цвет (он же сглаживание шрифта), его необходимо отключить. Я считаю, что CATextLayer делает это по умолчанию.

Do CGContextSetShouldSmoothFonts (context, false).

Спасибо, Аки!

Еще один комментарий Милена Джумерова:

Я не верю, что это точно. Мы рисуем текст в CALayers с субпиксельным сглаживанием. Вам просто нужно убедиться, что вы нарисовали за текстом, прежде чем рисовать сам текст. См. http://www.cocoabuilder.com/archive/message/cocoa/2008/3/28/202581 для справок.

Милен верна, если вы заранее знаете цвет фона, вы можете сделать:

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

И вы получите довольно субпиксель сглаженный текст. Однако, если вы не не знаете цвет фона, вам понадобится , чтобы отключить сглаживание шрифтов, иначе вы получите искаженные результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...