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 上的文本

具有亚像素 aa 的文本

两个图层的 800% 缩放

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

于 2013-02-10T11:47:38.577 回答
3

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

如何使 CATextLayer 中的文本清晰

于 2013-09-10T03:28:42.110 回答
2

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

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

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

于 2013-02-10T10:52:59.380 回答
1

如果您来寻找 CATextLayer 在 OSX 中渲染稍微模糊的文本的问题,经过多次撞墙后,我通过执行以下操作得到了清晰的文本:

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

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

于 2015-02-04T23:54:33.407 回答
1

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

我在Ignacio Nieto 博客上找到了可行的解决方案

textLayer.contentsScale = UIScreen.mainScreen().scale
于 2016-06-21T10:15:13.430 回答
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设置属性时忽略文本,.font但在使用桥接设置字体之前,它可用于在创建字体时存储字体大小

于 2018-10-04T09:14:23.260 回答