2013-02-10 39 views
8

Theo the documentation, nó có thể kích hoạt tính năng làm mịn phông chữ bên CATextLayer:Làm thế nào để CATextLayer trơn tru văn bản của nó?

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.

Sau đây là cách tôi hiểu câu này:

@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; 

mà không hoạt động. Văn bản không được vẽ bằng cách sử dụng tính năng chống răng cưa subpixel.

+0

Bạn đã cố gắng thiết lập màu nền lớp văn bản không? '[blackText setBackgroundColor: [NSColor whiteColor].CGColor] ' –

+0

@robmayoff Tôi thừa nhận tôi đã quên thử thiết lập màu nền thành whiteColor, nhưng nó không hoạt động, tức là nó không phải là subpixel aa. – alecail

+0

Tôi đang làm việc thông qua điều này bản thân mình vào lúc này. Ít nhất một vấn đề với đoạn mã ở trên là bạn đang yêu cầu lớp blackText tự động rasterise, điều này sẽ không giúp ích gì. Bạn cần phải nói cho một lớp siêu để rasterise các lớp con của nó vào nó khi nó render (bằng cách thiết lập 'setShouldRasterize:' trên đó. Tôi đọc của rằng bit của tài liệu cho thấy rằng nếu bạn làm điều này (trên lớp siêu) phụ -CATextLayer sẽ được rasterised vào lớp siêu với chống alising.Tôi sẽ được thử nghiệm sau này, trừ khi tôi tìm thấy một cách tiếp cận khác. – Benjohn

Trả lời

8

Phương pháp này được mô tả here công trình:

Trường hợp 2: Nếu bạn đang sử dụng một CATextLayer trực tiếp, bạn sẽ cần phải lớp con CATextLayer và làm điều gì đó như sau trong đang vẽ của bạn:

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

Dưới đây là một so sánh mịn vs phi vuốt:

text on a regular CATextLayer

text with sub-pixel-aa

800% zoom of both layers

PS: Đừng nhìn vào câu trả lời này trên màn hình CRT.

2

Cách tôi hiểu tài liệu này, nó nói rằng CATextLayerluôn luôn vô hiệu hóa chống răng cưa pixel phụ. Câu bạn trích dẫn chỉ được đưa ra dưới dạng giải thích cho điều này, không phải là hướng dẫn về cách bật tính năng này - theo sau là:

Đặt độ mờ của lớp thành YES không thay đổi chế độ hiển thị.

... có nghĩa là ngay cả khi bạn sử dụng nền mờ cho lớp, điều này sẽ không thay đổi thực tế là CATextLayer không sử dụng pixel phụ aa.

1

Nếu bạn đã tìm kiếm một vấn đề mà CATextLayer được render văn bản hơi mờ trong OSX, sau khi người đứng đầu nhiều tường đập , Tôi nhận được văn bản rõ ràng rõ ràng bằng cách thực hiện:

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

(Tôi cũng đặt nội dung của lớp nền nền là giống nhau).

0

Câu trả lời được chấp nhận không hoạt động đối với tôi.

tôi tìm thấy giải pháp làm việc trên Ignacio Nieto blog

textLayer.contentsScale = UIScreen.mainScreen().scale 
Các vấn đề liên quan