2012-07-06 4 views

Antwort

5

Ich lief heute Abend in dieselbe Sache. CG bietet keine einfache Möglichkeit, einen nicht-kreisförmigen Bogen zu zeichnen, aber Sie können dies mit CGPath und einer geeigneten Transformationsmatrix tun. Angenommen, Sie möchten einen Bogen einer achsgerichteten Ellipse, beginnend bei links, oben und mit einer Breite, Höhe. Dann können Sie etwas tun:

CGFloat cx = left + width*0.5; 
CGFloat cy = top + height*0.5; 
CGFloat r = width*0.5; 

CGMutablePathRef path = CGPathCreateMutable(); 
CGAffineTransform t = CGAffineTransformMakeTranslation(cx, cy); 
t = CGAffineTransformConcat(CGAffineTransformMakeScale(1.0, height/width), t); 
CGPathAddArc(path, &t, 0, 0, r, startAngle, endAngle, false); 
CGContextAddPath(g->cg, path); 

CGContextStrokePath(g); 

CFRelease(path); 

Beachten Sie, dass, wenn Sie einen tortenförmigen Keil zeichnen wollen, dann nur die „CGContextAddPath“ umgeben rufen mit einem CGContextMoveToPoint (cx, cy) und einen CGContextAddLineToPoint (cx, cy) und CGContextFillPath anstelle von CGContextStrokePath verwenden. (Oder wenn Sie gleichzeitig füllen und streichen möchten, verwenden Sie CGContextDrawPath.)

+0

Funktioniert gut - NB: machen Sie nicht den Fehler, den ich gemacht habe :). Die CGAffineTransformMakeTranslation ist * erforderlich *, auch wenn Sie MoveToPoint verwenden (weil die Transformation t angewendet werden muss, während die Kurve im Ursprung ist, oder die Skalierungstransformation von Apple wird außerdem Ihren Offset vom Ursprung multiplizieren!) – Adam

+0

Beachten Sie dies auch Skalieren Sie die Strichbreite. – Grodriguez