2013-06-07 4 views
6

Ich habe ein Problem beim Zeichnen eines Bogens innerhalb meiner Zeichenfunktion innerhalb einer CALayer-Unterklasse. Die Implementierung für die Zeichenfunktion ist wie folgt:CGContextAddArc entgegen dem Uhrzeigersinn statt im Uhrzeigersinn

-(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); 
} 

Nichts hier auch wegweisend, aber das Seltsame ist, dass sie den Bogen Zeichnung gegen den Uhrzeigersinn, obwohl ich angegeben, dass es im Uhrzeigersinn shoud. Umgekehrt, wenn ich NEIN für den Parameter im Uhrzeigersinn festlege, wird der Bogen im Uhrzeigersinn gezeichnet. Ich habe ein paar Nachforschungen über umgedrehte Koordinatensysteme angestellt und herausgefunden, dass dies möglicherweise das Problem ist, aber ich wollte nicht einfach den entgegengesetzten Bool-Parameter fest codieren, was ich meinte. Irgendwelche Vorschläge, wie Sie das beheben können?

Danke!

Antwort

7

Dies ist in der Tat wegen des umgedrehten Koordinatensystems von UIKit gegen Quarz. Von der docs for CGContext:

Der Parameter im Uhrzeigersinn bestimmt die Richtung, in der der Bogen erstellt wird; Die tatsächliche Richtung des letzten Pfads hängt von der aktuellen Transformationsmatrix des Grafikkontextes ab. Unter iOS beispielsweise kippt eine UIView die Y-Koordinate durch Skalierung der Y-Werte um -1. In einem gedrehten Koordinatensystem führt die Angabe eines Bogens im Uhrzeigersinn zu einem Bogen im Gegenuhrzeigersinn, nachdem die Transformation angewendet wurde.

Sie können dies in Ihrem Code lindern, indem die Transformations-Matrix mit Ihrem Kontext spiegeln:

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

Sie wollen wahrscheinlich es leicht zu schlagen zurück, wenn Sie mit Ihrer Zeichnung dh

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

// Draw... 

CGContextRestoreGState(ctx); 
fertig sind
+0

Danke für die super schnelle Antwort und Erklärung! Ich habe versucht, den Code hinzuzufügen, den Sie gepostet haben, und er zeichnet jetzt im Uhrzeigersinn wie erwartet, aber anstatt einen Quadranten zu zeichnen (der untere rechte Quadrant des Kreises wie erwartet für einen Bereich von 0-90 Grad), zeichnet er den 0-270 Grad-Bereich im Uhrzeigersinn. Irgendwelche Ideen warum? –

+0

Ich habe es gerade versucht, und es wird 3/4 eines Kreises von genau nach Osten (0 Grad) im Uhrzeigersinn bis genau nach Norden (90 Grad) gezeichnet. Wenn Sie den unteren rechten Quadranten des Kreises wünschen, sollte er von 0 Grad bis 270 Grad (genau nach Süden) im Uhrzeigersinn verlaufen. Der Parameter im Uhrzeigersinn ändert nicht, wie die Winkel interpretiert werden, nur welche "Hälfte" des Kreises gezeichnet wird. –

+0

Oh okay Ich denke ich verstehe, warum das so ist ... durch die Flip-Transformation werden die 90 und 270 Grad Positionen vertauscht und das x wird in Ruhe gelassen. Das tut mir leid. –

Verwandte Themen