8

ドキュメントによると、 CATextLayer 内でフォント スムージングを有効にすることが可能です。

Text can only be drawn using sub-pixel antialiasing when it is composited into an existing opaque background at the same time that it's rasterized.

これが私がこの文をどのように理解するかです:

@implementation CATextLayerWithFontSmoothing
-(id)init {
    self=[super init];
    if (self) {
    CALayer * whiteBackground = [CALayer layer];
    CATextLayer * blackText = [CATextLayer layer];

    [whiteBackground setBounds:NSMakeRect(0, 0, 300, 300)];
    [blackText setBounds:NSMakeRect(0, 0, 300, 300)];

    [whiteBackground setBackgroundColor:[NSColor whiteColor].CGColor];
    [blackText setForegroundColor:[NSColor blackColor].CGColor];
    [blackText setString:@"CATextLayer"];

    [blackText setShouldRasterize:YES];

    [self addSublayer:whiteBackground];
    [self addSublayer: blackText];

    }
    return self;

これは機能しません。テキストは、サブピクセル アンチエイリアシングを使用して描画されません。

4

6 に答える 6

9

ここで説明する方法は機能します。

ケース2:CATextLayerを直接使用している場合は、CATextLayerをサブクラス化し、描画コードで次のような操作を行う必要があります。

- (void)drawInContext:(CGContextRef)ctx
{
CGContextSetRGBFillColor (ctx, r, g, b, a);
CGContextFillRect (ctx, [self bounds]);
CGContextSetShouldSmoothFonts (ctx, true);
[super drawInContext:ctx];
}

平滑化と非平滑化の比較は次のとおりです。

通常のCATextLayerのテキスト

sub-pixel-aaのテキスト

両方のレイヤーの800%ズーム

PS:CRTでこの答えを見ないでください。

于 2013-02-10T11:47:38.577 に答える
3

遅れる場合があります。しかし、スティーブの答えとnacho4dのコメントのように、この質問には完璧な解決策があることがわかります:

CATextLayer のテキストを明確にする方法

于 2013-09-10T03:28:42.110 に答える
2

私がこのドキュメントを理解している方法では、CATextLayer 常にサブピクセルのアンチエイリアシングを無効にしていると書かれています。あなたが引用した文は、これを有効にする方法の説明としてではなく、これについての説明として与えられています。その後に次の文が続きます。

レイヤーの opacity プロパティを に設定してYESも、レンダリング モードは変更されません。

...これは、レイヤーに不透明な背景を使用しても、CATextLayersub-pixel-aa を使用しないという事実は変わらないことを意味します。

于 2013-02-10T10:52:59.380 に答える
1

受け入れられた答えは私にはうまくいきません。

Ignacio Nieto ブログで有効な解決策を見つけました

textLayer.contentsScale = UIScreen.mainScreen().scale
于 2016-06-21T10:15:13.430 に答える
1

OSX で CATextLayer がわずかにぼやけたテキストをレンダリングする問題を探している場合は、何度もウォール ヘッド バンギングを行った後、次のようにしてシャープでクリアなテキストを取得しました。

text_layer.contentsScale = self.window!.backingScaleFactor
text_layer.zPosition = 0

(ビューの背景レイヤーのcontentsScaleも同じに設定しました)。

于 2015-02-04T23:54:33.407 に答える