根据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;
哪个不起作用。不使用子像素消除锯齿绘制文本。
答案 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];
}
以下是平滑与非平滑的比较:
PS:不要在CRT上看这个答案。
答案 1 :(得分:3)
可能会迟到。但我看到这个问题有一个完美的解决方案,正如史蒂夫的回答,以及nacho4d的评论:
答案 2 :(得分:2)
我理解这个文档的方式,它说CATextLayer
总是禁用子像素抗锯齿。您引用的句子仅作为对此的解释,而不是如何启用它的说明 - 接下来是:
将图层的opacity属性设置为
YES
不会改变渲染模式。
...这意味着即使您为图层使用不透明背景,也不会改变CATextLayer
不使用子像素-a的事实。
答案 3 :(得分:1)
如果您正在搜索CATextLayer在OSX中渲染稍微模糊的文本的问题,在经过多次敲门声后,我会通过以下方式获得清晰明确的文字:
text_layer.contentsScale = self.window!.backingScaleFactor
text_layer.zPosition = 0
(我还将视图背景图层contentsScale设置为相同)。
答案 4 :(得分:0)
答案 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
,但是在设置带有桥接的字体之前,可以在创建字体时使用它来存储字体大小