2012-07-13 18 views
7

Tengo una UIBezierCurve compleja que necesito dibujar una vez con algunos parámetros de línea particulares, y luego dibujarla de nuevo como superposición con otros parámetros de línea, pero también necesito que la última parte de la curva sea ligeramente más corta que en la anterior.¿Quieres hacer una copia independiente de UIBezierPath?

Para hacer esto, quiero crear la curva por addLineToPoint:, moveToPoint: hasta la última parte, luego hacer una copia de esta curva y agregar los segmentos finales de la línea de forma diferente en las curvas originales y copiadas. Y luego acaricio la curva original, y la copiada.

El problema es que no funciona como esperaba. puedo crear una copia de la curva por:

UIBezierPath* copyCurve = [originalCurve copy]; 

Y el dibujo que hago en el originalCurve después de eso, se aplica también a la copyCurve, por lo que no puede hacer el dibujo independiente de cualquiera de estas curvas.

¿Cuál es el motivo de esta conexión entre el original y la copia y cómo puedo deshacerme de él?

EDIT 1: Una solución que he encontrado es la creación de la copia de la siguiente manera:

UIBezierPath* copyCurve=[UIBezierPath bezierPathWithCGPath:CGPathCreateMutableCopy(originalCurve.CGPath)]; 

Dado que esto funciona correctamente, tal vez el problema está en la inmutabilidad de la copia de recibo con

[originalCurve copy] 
+0

¿Te ha alloc' '/' init '¿tu copia Curva? – Dustin

+0

No, solo lo que está escrito en mi pregunta ... – BartoNaz

Respuesta

19

crear una nueva ruta idéntica mediante el uso de la CGPath.

path2 = [UIBezierPath bezierPathWithCGPath:path1.CGPath]; 

Los documentos de propiedad CGPath establecen que:

Esta propiedad contiene una instantánea de la ruta en cualquier punto dado en el tiempo. Obtener esta propiedad devuelve un objeto de ruta inmutable que puede pasar a las funciones de gráficos básicos.

+0

Por favor, eche un vistazo a mi edición de la pregunta. Me parece que no podré cambiar el objeto de ruta inmutable, así que probablemente necesito el objeto mutable. – BartoNaz

+2

No puede cambiar CGPath, pero el objeto UIBezierPath creado con CGPath es mutable. – jrturton

+0

No, lo siento. Realmente funciona. ¡Gracias! – BartoNaz

2

Además de @jrturton respuesta: -

Alternativamente podemos utilizar: -

let path = UIBezierPath(ovalIn: pathRect) 
let newPath = path.cgPath.copy(strokingWithWidth: strokeWidth, lineCap: .butt, lineJoin: .miter, miterLimit: 0) 

enter image description here

Reference

+0

actualizarlo para swift 3 let storkedArc = arc.copy (strokingWithWidth: 5.0, lineCap: .butt, lineJoin: .miter, mitreLimit: 10) –

Cuestiones relacionadas