Dibujando una línea discontinua con CGContextSetLineDash

Estoy intentando dibujar una línea punteada con CGContextSetLineDash .

Aquí está mi código:

 float dashPhase = 0.0; float dashLengths[] = {30, 30}; CGContextSetLineDash(context, dashPhase, dashLengths, 20.0); self.previousPoint2 = self.previousPoint1; self.previousPoint1 = previous; self.currentPoint = current; self.mid1 = [self pointBetween:self.previousPoint1 andPoint:self.previousPoint2]; self.mid2 = [self pointBetween:self.currentPoint andPoint:self.previousPoint1]; UIBezierPath* newPath = [UIBezierPath bezierPath]; [newPath moveToPoint:self.mid1]; [newPath addLineToPoint:self.mid2]; [newPath setLineWidth:self.brushSize]; 

Sin embargo, si dibujo lentamente, las líneas discontinuas no aparecen (vea la parte superior de la image a continuación), pero si dibujo rápidamente, aparecerán (vea la parte inferior de la image a continuación).

introduzca la descripción de la imagen aquí

¿Por qué está pasando esto?

Ha establecido dashPhase = 0. , por lo tanto, cada vez que comienza una nueva línea, el patrón comienza con un segmento pintado de 30 unidades, seguido de un segmento sin pintar de 30 unidades. Si los segmentos de línea son cortos, se pintará toda la línea.

Por lo tanto, usa una sola ruta, donde solo anexa segmentos de línea, o calcula por cada nueva dashPhase el dashPhase donde comenzar el patrón.

(¿No debería ser el último parámetro de CGContextSetLineDash la longitud de dashLengths[] , es decir, 2 ?)

ACTUALIZACIÓN: tal como descubrimos en la discusión, la solución al problema fue, de hecho, agregar segmentos de línea al último path de bezier siempre que el usuario dibuje la misma curva:

 -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { // ... // Compute nextPoint to draw ... UIBezierPath *lastPath = [self.paths lastObject]; [lastPath addLineToPoint:self.nextPoint]; // ... }