10

CoreAnimationレイヤー内に文字列を表示したいのですが、残念ながらCATextLayerでは不十分です。これは主に、制約を使用するときに使用が難しくテキストを折り返したいためです。

次のコード(PyObjC)を使用してNSLayoutManagerを使用しています。

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のバージョンです。

足りないものはありますか?

4

1 に答える 1

16

coretext-devアーカイブは検索できないので、私はこれに答えています。AppleのAkiInoueが私の質問に答えました。

CALayerはサブピクセルカラー(別名フォントスムージング)を表すことができないため、無効にする必要があります。CATextLayerがデフォルトでそれを行うと思います。

CGContextSetShouldSmoothFonts(context、false)を実行します。

ありがとう、アキ!

Milen Dzhumerovによる別のコメント:

これは正確ではないと思います。サブピクセルアンチエイリアシングを使用してテキストを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)

そして、かなりサブピクセルのアンチエイリアステキストを取得します。ただし、背景色がわからない場合は、フォントスムージングをオフにする必要があります。そうしないと、文字化けした結果が得られます。

于 2009-04-03T21:24:18.383 に答える