2012-01-10 4 views
5

Sto provando a creare una barra di caricamento circolare e voglio usare Core Graphics invece di mascherare le immagini per creare l'effetto. Tuttavia, non sto ottenendo la fedeltà che speravo: enter image description hereSmoothing Core Curve grafiche

Non importa cosa ho provato, i goccioline sembrano piuttosto male. L'antialiasing è attivo e ho già provato a trasformare la "piattezza" in .1 su CGContextRef. L'immagine proviene dal simulatore (Retina), sembra leggermente meglio su un dispositivo, ma non è poi così eccezionale.

Disegno codice, all'interno di una sottoclasse di 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); 
} 

E 'questa la migliore grafica core può fare o mi sto perdendo qualcosa?

+1

Considerando che l'immagine è stata chiaramente ridimensionata di 2 in ogni dimensione, e hai scattato l'immagine dal simulatore Retina, direi che c'è un problema con la trasformazione del tuo livello o di uno dei suoi genitori. Stai creando 'ctx' in qualche altro metodo o è il framework che ti passa? Qual è l'output di 'NSLog ("% @ ", [[[UIApplication sharedApplication] keyWindow] recursiveDescription])'? –

+0

Il contesto mi viene fornito dal CALayer. [Here] (http://pastebin.com/0Gjkxh2a) è l'output di 'recursiveDescription'. 'KDGoalBar' è la sottoclasse UIControl in cui viene inserito e' KDGoalBarPercentLayer' è dove viene eseguito il disegno corrente. – Kevin

risposta

10

Ho scoperto il mio problema specifico. Poiché stavo creando un CALayer (da aggiungere come sottolivello) lo contentScale non veniva automaticamente impostato su un display Retina. Questo lo risolve:

percentLayer.contentsScale = [UIScreen mainScreen].scale; 

Grazie Rob, per avermi spinto nella giusta direzione.

+0

Vorrei poter +10 questo. – coneybeare

+0

ridimensionamento, è la trappola per principianti come me che visualizzano in anteprima il codice di disegno nella schermata non retina e vedere il bordo frastagliato quando si dispiega nella retina schermo. La tua parola "scala" mi ricorda immediatamente che sto disegnando in un contesto non retina e mi aspetto che sia esattamente la stessa nel contesto della retina. +1 per te. –