2011-06-11 4 views
5

He creado un UIBezierPath complejo que está compuesto por varios segmentos de ruta, sólidos, discontinuos, líneas, colores, arcos, etc. Así que tengo esto y ahora quiero para renderizarlo en un CGContext.iPhone - copiando un UIBezierPath en un CGPath y renderizado como el original

Por lo tanto, convertirlo en un CGPathReference usando

CGPathRef cgPath = CGPathCreateCopy(aBezierPath.CGPath); 

El problema es el siguiente: en teoría, si quiero dibujar un trazado en un CGContext, tengo que definir la anchura del trazo, el color, la línea estilo, modo de fusión, etc. para cada segmento que debe ser diferente, pero el UIBezierPath que ya he creado contiene toda esta información.

Por lo tanto, me pregunto si hay una manera de simplemente "estampar" el CGPath como está en el CGContext, por lo que se sellará con toda la información original?

gracias.

+1

¿No puede simplemente usar el método de trazo de UIBezierPath? –

Respuesta

6

DR, tienes razón: ¡es muy confuso!

Pero creo que Tom es correcto, solo use [aBezierPath stroke].

Por lo tanto, sería algo como esto:

REF es un (CGContextRef), que usted ha construido.

YOURBEZIERPATH es un (UIBezierPath *).

Inevitablemente hay que tratar el tema "dibujo al revés", por lo que:

UIGraphicsPushContext(REF); 
CGContextSaveGState(REF); 
CGContextTranslateCTM(REF, 0, the height*); 
CGContextScaleCTM(REF, 1.0, -1.0); 
[YOURBEZIERPATH stroke]; 
CGContextRestoreGState(REF); 
UIGraphicsPopContext(); 

Así que es eso.

Re su comentario a continuación: Tengo una variedad de UIBezierPaths. Cada bezier tiene su propio estilo y color.

¿Le sirve de ayuda? ... Cambie el llamado "golpe", con un bucle for:

UIGraphicsPushContext(REF); 
CGContextSaveGState(REF); 
CGContextTranslateCTM(REF, 0, the height*); 
CGContextScaleCTM(REF, 1.0, -1.0); 

for each of YOURBEZIERPATH in your array... 
    { 
    CGContextSaveGState(REF); 
    [YOURBEZIERPATH stroke]; 
    CGContextRestoreGState(REF); 
    } 

CGContextRestoreGState(REF); 
UIGraphicsPopContext(); 

En realidad no tiene que molestarse usando aBezierPath.CGPath, o una copia del mismo.

Nuevamente, tiene razón, es muy confuso, los dos mundos de la interfaz de usuario y CG!


* la altura: a menudo algo así como self.frame.size.height. Solo incluyo esto para cualquiera que busque código de ejemplo general en el futuro.

+0

Gracias, esto casi funciona para mí. Mi único problema es este: tengo un conjunto de UIBezierPaths que tengo que dibujar en el contexto. Cada bezier tiene su propio estilo y color. Cuando uso su método para trazar las rutas en un bucle, cada vez que se llama a su método, todas las rutas, incluidas las que se acariciaron previamente, cambiaron al último estilo especificado. Por ejemplo: tengo 3 rutas: discontinua/azul, sólida/roja, sólida/verde. Después de la primera ejecución, tengo una ruta discontinua/azul. Después de la segunda ejecución, tengo dos rutas sólidas/rojas y después de la tercera, todas las rutas cambian a sólido/verde. – SpaceDog

+0

Gracias Joe, me confundieron algunos conceptos pero ahora funciona como magia. ¡¡¡Gracias!!! – SpaceDog

+0

No, hice lo inverso, dibujo todos los caminos cada vez que necesito actualizar algo. Dibujar todos los caminos no es tan lento como pensaba, entonces está funcionando muy bien. – SpaceDog

Cuestiones relacionadas