2013-04-24 23 views
20

Ich erstelle eine CAShapeLayer als Maske für eine UIView Ebene verwenden. Ich verwende eine UIBezierPath, um die Formebene zu zeichnen. Es funktioniert gut, außer dass ich ein paar seltsame Ergebnisse bekomme, wenn ich zeichne. Die Geometrie verhält sich nicht wie erwartet. Ich versuche einfach „Tortenstück“ in der oberen rechten Ecke zu ziehen:Warum gibt AddArcWithCenter einen StartAngle von 0 Grad Start bei 90 Grad?

#define degreesToRadians(x) ((x) * M_PI/180.0) 

... 

// "layer" refer's to the UIView's root layer 

CAShapeLayer *maskLayer = [CAShapeLayer layer]; 

maskLayer.frame = 
    layer.presentationLayer ? 
    ((CAGradientLayer *)layer.presentationLayer).bounds : layer.bounds; 
maskLayer.fillRule = kCAFillRuleEvenOdd; 
maskLayer.needsDisplayOnBoundsChange = YES; 

CGFloat maskLayerWidth = maskLayer.bounds.size.width; 
CGFloat maskLayerHeight = maskLayer.bounds.size.height; 
CGPoint maskLayerCenter = 
    CGPointMake(maskLayerWidth/2,maskLayerHeight/2); 

UIBezierPath *path = [UIBezierPath bezierPath]; 

[path moveToPoint:maskLayerCenter]; 

[path addArcWithCenter:maskLayerCenter radius:(maskLayerWidth/2) 
startAngle:degreesToRadians(0) endAngle:degreesToRadians(90) clockwise:YES]; 

[path closePath]; 


maskLayer.path = path.CGPath; 

layer.mask = maskLayer; 

Das Endergebnis ist, dass ein Kreissegment wird in der unteren rechten Ecke gezogen. Der erste Punkt des Bogens wird um 90 Grad und dann um 180 Grad gezeichnet. Warum macht er das, obwohl ich Winkel von 0 und 90 Grad verwende?

Antwort

67

Dieses Bild kommt direkt aus the documentation.

image

Und es gibt eine Diskussion darüber, wie es funktioniert (bei der Standard-Koordinatensystem)

Diskussion
Diese Methode des angegebenen Lichtbogen an dem aktuellen Punkt beginnen hinzufügt. Der erzeugte Bogen liegt am Umfang des angegebenen Kreises. Wenn sie im Standardkoordinatensystem gezeichnet werden, basieren die Anfangs- und Endwinkel auf dem Einheitskreis, der in Abbildung 1 gezeigt wird. Wenn Sie beispielsweise einen Anfangswinkel von 0 Radiant, einen Endwinkel von π Radiant und den Parameter im Uhrzeigersinn auf YES festlegen, wird die untere Hälfte des Kreises gezeichnet. Wenn Sie jedoch die gleichen Anfangs- und Endwinkel angeben, aber den clockwise Parametersatz auf NO setzen, wird die obere Hälfte des Kreises gezeichnet.

So funktionieren die Winkel für addArcWithCenter:radius:startAngle:endAngle:clockwise:. Wenn Sie das nicht sehen, berechnen Sie Ihre Winkel falsch.

9

Werfen Sie einen Blick auf in der bezierPathWithArcCenter:radius:startAngle:endAngle:clockwise: Dokumentation: Für ein „Tortenstück“ in der rechten oberen Ecke Sie die Parameter

startAngle:degreesToRadians(-90) endAngle:0 clockwise:YES 

(Der Grund ist, verwenden, dass die Standard-Koordinaten System auf iOS hat eine x-Achse nach rechts und eine y-Achse nach unten.)