2013-06-07 18 views
6

Ho un problema quando disegno un arco all'interno della mia funzione di disegno all'interno di una sottoclasse CALayer. L'implementazione di tale funzione di disegno è la seguente:CGContextAddArc in senso antiorario invece che in senso orario

-(void)drawInContext:(CGContextRef)ctx 
{ 
    CGPoint center = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2); 
    CGFloat radius = MIN(center.x, center.y); 

    CGContextBeginPath(ctx); 

    CGContextAddArc(ctx, center.x, center.y, radius, DEG2RAD(0), DEG2RAD(90), YES); 

    CGContextSetStrokeColorWithColor(ctx, [UIColor whiteColor].CGColor); 
    CGContextSetLineWidth(ctx, 5); 

    CGContextDrawPath(ctx, kCGPathStroke); 
} 

Niente di troppo rivoluzionario qui, ma la cosa strana è che si sta disegnando l'arco in senso antiorario, anche se ho specificato che shoud essere in senso orario. Viceversa, quando si specifica NO per il parametro in senso orario, si disegna l'arco in senso orario. Ho fatto qualche ricerca sui sistemi di coordinate capovolte e ho immaginato che potesse essere il problema qui, ma non volevo limitarmi a codificare il parametro bool opposto di quello che intendevo. Qualche suggerimento su come risolvere questo problema?

Grazie!

risposta

7

Ciò è dovuto in effetti al sistema di coordinate capovolte di UIKit vs Quartz. Da docs for CGContext:

Il parametro in senso orario determina la direzione in cui viene creato l'arco; la direzione effettiva del percorso finale dipende dalla matrice di trasformazione corrente del contesto grafico. Ad esempio, su iOS, un UIView capovolge la coordinata Y ridimensionando i valori Y di -1. In un sistema di coordinate capovolte, specificando un arco in senso orario si ottiene un arco in senso antiorario dopo l'applicazione della trasformazione.

È possibile alleviare questo nel codice utilizzando la matrice di trasformazione per capovolgere vostro contesto:

CGContextTranslateCTM(ctx, 0.0, self.bounds.size.height); 
CGContextScaleCTM(ctx, 1.0, -1.0); 

Probabilmente si desidera capovolgere indietro quando si è finito con il disegno cioè

CGContextSaveGState(ctx); 
CGContextTranslateCTM(ctx, 0.0, self.bounds.size.height); 
CGContextScaleCTM(ctx, 1.0, -1.0); 

// Draw... 

CGContextRestoreGState(ctx); 
+0

Grazie per la risposta e la spiegazione super veloce! Ho provato ad aggiungere il codice che hai postato e ora sto disegnando in senso orario come previsto, ma invece di disegnare un quadrante (il quadrante in basso a destra del cerchio come previsto per un intervallo di 0-90 gradi), sta disegnando la gamma di 0-270 gradi in senso orario. Qualche idea, perché? –

+0

Ho appena provato questo, e si sta disegnando 3/4 di un cerchio da due est (0 gradi) in senso orario a nord nord (90 gradi). Se si desidera il quadrante in basso a destra del cerchio, dovrebbe essere da 0 gradi a 270 gradi (a sud) in senso orario. Il parametro in senso orario non cambia il modo in cui gli angoli vengono interpretati, ma solo la "metà" del cerchio viene disegnata. –

+0

Oh ok, penso di aver capito perché ... dalla trasformazione capovolta le posizioni di 90 e 270 gradi vengono scambiate e la x viene lasciata sola. Mi dispiace per quello –