2012-07-06 17 views

Respuesta

5

Me encontré con lo mismo esta noche. CG no ofrece una forma fácil de dibujar un arco no circular, pero puede hacerlo utilizando CGPath y una matriz de transformación adecuada. Supongamos que desea un arco de una elipse alineada con el eje comenzando a la izquierda, arriba y con un tamaño de ancho, alto. A continuación, puede hacer algo como esto:

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

Tenga en cuenta que si desea dibujar una cuña en forma de pastel, a continuación, sólo rodean el "CGContextAddPath" llame con un CGContextMoveToPoint (cx, cy) y una CGContextAddLineToPoint (cx, cy), y usa CGContextFillPath en lugar de CGContextStrokePath. (O si desea llenar y trazar al mismo tiempo, use CGContextDrawPath.)

+0

Funciona muy bien - Nota: no cometa el error que cometí :). la traducción CGAffineTransformMakeTranslation es * requerida * incluso si está usando MoveToPoint (porque la transformación t debe aplicarse mientras la curva está en el origen, o la transformación de escala de Apple TAMBIÉN multiplicará su desplazamiento desde el origen!) – Adam

+0

Tenga en cuenta que también escala el ancho del trazo. – Grodriguez

Cuestiones relacionadas