2012-01-10 10 views
5

Próbuję utworzyć okrągły pasek ładowania i chcę użyć Core Graphics zamiast maskować obrazy, aby uzyskać efekt. Jednak nie dostaję wierności, na którą liczyłem: enter image description hereWygładzanie krzywych grafiki rdzenia

Bez względu na to, co próbowałem, strzępy wydają się bardzo złe. Antyaliasing jest włączony i już próbowałem zmienić "płaskość" na .1 na CGContextRef. Obraz pochodzi z symulatora (Retina), wygląda nieco lepiej na urządzeniu, ale nadal nie jest świetny.

Rysunek kodu wewnątrz podklasy CALayer:

-(void)drawInContext:(CGContextRef)ctx {  
    CGPoint center = CGPointMake(self.frame.size.width/2, self.frame.size.height/2); 

    CGFloat delta = toRadians(360 * percent); 

    CGFloat innerRadius = 69.5; 
    CGFloat outerRadius = innerRadius + 12; 

    CGContextSetFillColorWithColor(ctx, [UIColor colorWithRed:99/256.0 green:183/256.0 blue:70/256.0 alpha:.5].CGColor); 
    CGContextSetStrokeColorWithColor(ctx, [UIColor colorWithRed:99/256.0 green:183/256.0 blue:70/256.0 alpha:10.0].CGColor); 
    CGContextSetLineWidth(ctx, 1); 

    CGMutablePathRef path = CGPathCreateMutable(); 

    CGPathAddRelativeArc(path, NULL, center.x, center.y, innerRadius, -(M_PI/2), delta); 
    CGPathAddRelativeArc(path, NULL, center.x, center.y, outerRadius, delta - (M_PI/2), -delta); 
    CGPathAddLineToPoint(path, NULL, center.x, center.y-innerRadius); 

    CGContextAddPath(ctx, path); 
    CGContextFillPath(ctx); 
    CGContextAddPath(ctx, path); 
    CGContextStrokePath(ctx); 
} 

Jest to najlepsze rdzeń graficzny może zrobić albo ja czegoś brakuje?

+1

Biorąc pod uwagę, że obraz został wyraźnie przeskalowany o 2 w każdym wymiarze, a wykonałeś zdjęcie z symulatora Retina, powiedziałbym, że jest problem z przekształceniem twojej warstwy lub jednego z jej rodziców. Czy tworzysz 'ctx' w jakiejś innej metodzie, czy też jest to framework, który je przekazuje? Jaki jest wynik działania 'NSLog ("% @ ", [[[UIApplication sharedApplication] keyWindow] recursiveDescription])'? –

+0

Kontekst jest mi dany przez CALayer. [Tutaj] (http://pastebin.com/0Gjkxh2a) jest wynikiem działania 'recursiveDescription'. 'KDGoalBar' jest podklasą UIControl, w której jest umieszczana, a' KDGoalBarPercentLayer' jest tam, gdzie jest wykonywany faktyczny rysunek. – Kevin

Odpowiedz

10

Odkryłem mój konkretny problem. Odkąd stworzyłem CALayer (aby dodać jako podwarstwę), contentScale nie został automatycznie ustawiony na ekran Retina. To rozwiązuje:

percentLayer.contentsScale = [UIScreen mainScreen].scale; 

Dziękuję Rob, za popchnięcie mnie we właściwym kierunku.

+0

Chciałbym móc to zrobić +10. – coneybeare

+0

skalowanie, jest pułapką dla początkujących takich jak ja, którzy wyświetlają podgląd kodu na ekranie innym niż siatkówka i widzą postrzępioną krawędź po umieszczeniu na ekranie siatkówki. Twoje słowo "skala" natychmiast przypomina mi, że rysuję w kontekście nieretinowym i oczekuję, że będzie ono dokładnie takie samo w kontekście siatkówki. +1 dla ciebie. –