2013-02-10 16 views
8

Według the documentation, możliwe jest, aby włączyć wygładzanie czcionek wewnątrz CATextLayer:Jak uzyskać tekst 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.

Oto jak rozumiem to zdanie:

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

który nie działa. Tekst nie jest rysowany za pomocą wygładzania podpikselami subpikseli.

+0

próbowałeś ustawienie warstwie tekstowej koloru tła? '[blackText setBackgroundColor: [NSColor whiteColor].CGColor] ' –

+0

@robmayoff Przyznaję, że zapomniałem spróbować ustawić kolor tła na whiteColor, ale to nie działa, tzn. Nie ma subpiksela aa. – alecail

+0

Sam w tej chwili pracuję nad tym. Co najmniej jeden problem z powyższym kodem polega na tym, że mówisz o warstwie blackText do rasteryzacji, co nie pomoże. Musisz wskazać superwarstwę, aby rasteryzować jej warstwy podrzędne w momencie renderowania (ustawiając na niej "setShouldRasterize:".) Moje czytanie tego fragmentu dokumentacji sugeruje, że jeśli to zrobisz (na superwarstwie) -CATextLayer zostanie poddany rasteryzacji do superwarstwy z antyliasingiem. Testuję później, chyba że znajdę inne podejście. – Benjohn

Odpowiedz

8

Metoda opisana here prace:

Przypadek 2: Jeśli używasz bezpośrednio do CATextLayer, musisz podklasy CATextLayer i zrobić coś tak jak poniższy kod w swoim rysunku:

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

Oto porównanie wygładzone vs Skokowe:

text on a regular CATextLayer

text with sub-pixel-aa

800% zoom of both layers

PS: Nie patrz na to odpowiedź na CRT.

2

Sposób, w jaki rozumiem tę dokumentację, mówi, że CATextLayerzawsze wyłącza podpikselowe wygładzanie. Zdanie ty cytowany jest tylko podane jako wytłumaczenie dla tego, a nie jako instrukcje jak go włączyć - to następuje:

Ustawienie właściwości krycie warstwy do YES nie zmienia trybu renderowania.

... co oznacza, że ​​nawet jeśli korzystasz z nieprzezroczystego tła na warstwę, to nie zmienia to faktu, że CATextLayer nie używa subpiksel-AA.

1

Jeśli przyszedł szukając problemu gdzie CATextLayer jest renderowania tekstu lekko rozmyte w OSX po głowie dużo ścianie walić , mam ostry wyraźny tekst, wykonując:

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

(ja również ustawić ciami warstwy tła contentsScale być takie same).

0

Zaakceptowana odpowiedź nie działa dla mojej.

znalazłem roztwór roboczy na Ignacio Nieto blog

textLayer.contentsScale = UIScreen.mainScreen().scale 
Powiązane problemy