Frage

Ich mag Strings innerhalb Coreanimation Schichten angezeigt werden, aber leider CATextLayer ist nicht genug, vor allem, weil es schwierig ist, zu verwenden, wenn mit Einschränkungen und Sie wollen den Text wickeln.

Ich bin mit NSLayoutManager, mit dem folgenden Code (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()

Das ist alles in Ordnung und funktionstüchtig, aber das einzige Problem ist, dass es schlecht aus Text erzeugt (obwohl es ist antialised).

Hier ist die CATextLayer Version:

Und hier ist die NSLayoutManager Version:

Alles, was ich bin fehlt?

War es hilfreich?

Lösung

Ich beantworte dies, weil die Core-dev Archive nicht durchsuchbar sind, und Aki Inoue von Apple antwortete nur meine Frage:

  

Da CALayer nicht Subpixel Farbe (auch bekannt als Schriftglättung) darstellt, müssen Sie es deaktivieren.   Ich glaube, CATextLayer tut es standardmäßig aktiviert.

     

Sie CGContextSetShouldSmoothFonts (Kontext, false).

Danke, Aki!

Ein weiterer Kommentar von Milen Dzhumerov:

  

Ich glaube nicht, dass dies richtig ist. Wir zeichnen Text in CALayers mit Subpixel-Anti-Aliasing. Sie müssen nur sicherstellen, dass Sie hinter dem Text gezeichnet haben, bevor Sie den Text selbst zu ziehen. Siehe http://www.cocoabuilder.com/archive/message/ Kakao / 2008/3/28/202581 für Referenzen.

Milen ist richtig, falls Sie vorher wissen, die Hintergrundfarbe, können Sie tun:

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

Und Sie erhalten ziemlich Unterpixel Anti-Aliasing-Text. Allerdings, wenn Sie nicht kennt die Hintergrundfarbe, Sie Notwendigkeit deaktivieren Schriftglättung oder Sie werden verstümmelte Ergebnisse erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top