如何让CATextLayer平滑其文本?

时间:2013-02-10 10:35:53

标签: objective-c macos core-animation antialiasing subpixel

根据the documentation,可以在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;

哪个不起作用。不使用子像素消除锯齿绘制文本。

6 个答案:

答案 0 :(得分:8)

here描述的方法有效:

案例2:如果您直接使用CATextLayer,则需要 子类CATextLayer并执行以下操作 绘图代码:

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

以下是平滑与非平滑的比较:

text on a regular CATextLayer

text with sub-pixel-aa

800% zoom of both layers

PS:不要在CRT上看这个答案。

答案 1 :(得分:3)

可能会迟到。但我看到这个问题有一个完美的解决方案,正如史蒂夫的回答,以及nacho4d的评论:

How to get text in a CATextLayer to be clear

答案 2 :(得分:2)

我理解这个文档的方式,它说CATextLayer 总是禁用子像素抗锯齿。您引用的句子仅作为对此的解释,而不是如何启用它的说明 - 接下来是:

  

将图层的opacity属性设置为YES不会改变渲染模式。

...这意味着即使您为图层使用不透明背景,也不会改变CATextLayer不使用子像素-a的事实。

答案 3 :(得分:1)

如果您正在搜索CATextLayer在OSX中渲染稍微模糊的文本的问题,在经过多次敲门声后,我会通过以下方式获得清晰明确的文字:

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

(我还将视图背景图层contentsScale设置为相同)。

答案 4 :(得分:0)

接受的答案对我不起作用。

我在Ignacio Nieto blog

找到了工作解决方案
textLayer.contentsScale = UIScreen.mainScreen().scale

答案 5 :(得分:0)

最常见的情况是使用清晰可见的清晰字体, 因此在Objective-C中看起来像...

CATextLayer *text = [CATextLayer layer];
text.allowsEdgeAntialiasing = NO;
text.allowsFontSubpixelQuantization = YES;
// the following is a CGFloat, so can even be scaled down, to make it pixelish
text.contentsScale = [UIScreen mainScreen].scale;
text.frame = CGRectInset(self.frame, 0, 5);
text.foregroundColor = UIColor.orangeColor.CGColor;
text.fontSize = 36.0;
text.font = (__bridge CFTypeRef _Nullable)([UIFont fontWithName:@"HelveticaNeue-UltraLight" size:text.fontSize]);
[self.layer addSublayer:text];
设置.fontSize属性时,会忽略

text .font,但是在设置带有桥接的字体之前,可以在创建字体时使用它来存储字体大小