2013-02-10 18 views
8

the documentation göre, CATextLayer içindeki yazı tipi düzeltmeyi etkinleştirmek mümkündür:CATextLayer metni nasıl pürüzsüz hale getirir?

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

çalışmaz:

İşte

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.

Ben bu cümleyi anlamaya nasıl. Metin subpixel kenar yumuşatma kullanılarak çizilmez.

+0

üzerinde çalışan çözüm buldu? [blackText setBackgroundColor: [NSColor whiteColor].CGColor] ' –

+0

@robmayoff Kabul ediyorum, arka plan rengini whiteColor olarak ayarlamayı denedim, ama işe yaramıyor, yani non-subpixel aa. – alecail

+0

Şu anda bu konuda çalışıyorum. Yukarıdaki kodla ilgili en az bir sorun, blackText katmanının kendisine rasterleştirileceğini söylediğinizdir, bu da size yardımcı olmaz. Alt katmanlarını oluştururken alt katmanlarını (setShouldRasterize: 'ayarlayarak) rasterleştirmek için süper bir katman söylemelisiniz. Belgelerin birazını okumuş olursanız, bunu (süper katman üzerinde) -CATextLayer anti-alising ile süper katmana rasterleştirilecek. Başka bir yaklaşım bulamadıkça daha sonra test edeceğim. – Benjohn

cevap

8

yöntem here eser açıklanan

text on a regular CATextLayer

: Burada

düzleştirilmemiş vs düzleştirilmiş bir karşılaştırma

text with sub-pixel-aa

800% zoom of both layers

Not: Bir CRT bu cevaba bakma.

2

Bu belgeyi anladığım şekilde, her zaman CATextLayerher zaman alt piksel antialiasing özelliğini devre dışı bıraktığını söylüyor. Eğer alıntı cümle adil değil etkinleştirmek için ilgili talimatlar olarak bunun için bir açıklama olarak verilmiştir - bu takip ediyor: oluşturma modu değişmez YES için katmanın donukluk özelliğinin ayarlanması

. Eğer katman için opak bir arka plan kullanın bile bu CATextLayer alt piksel-aa kullanmaz gerçeğini değiştirmeyecek ima

....

Durum 2: Doğrudan bir CATextLayer kullanıyorsanız, size çizim kodunda aşağıdaki alt sınıf CATextLayer gerekiyor ve böyle bir şey yapacağız:

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

beceriyor ise: Ama bu soru Steve'in cevap olarak mükemmel bir çözüm vardır ve nacho4d 'in yorumları görüyoruz

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

(Ben de aynı olması görünümleri arka plan katmanı contentsScale set): Ben yaparak keskin düz metin var.

0

Kabul edilen yanıt benim için çalışmaz.

Ben metin katmanın arka plan rengini ayarlama denediniz Ignacio Nieto blog

textLayer.contentsScale = UIScreen.mainScreen().scale