2012-10-22 17 views
5

Sto provando a disegnare una linea tratteggiata con CGContextSetLineDash.Disegno di una linea tratteggiata con CGContextSetLineDash

Ecco il mio codice:

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

Tuttavia, se disegno lentamente, linee tratteggiate non appaiono (vedi parte superiore dell'immagine qui sotto), ma se io disegnare rapidamente, lo fanno apparire (vedi parte inferiore dell'immagine qui sotto).

enter image description here

Perché succede questo?

+1

Non vedo come questo sia correlato a Xcode. –

risposta

4

È stato impostato dashPhase = 0., pertanto ogni volta che si avvia una nuova linea, il motivo inizia con un segmento verniciato di 30 unità, seguito da un segmento non verniciato di 30 unità. Se i segmenti di linea sono brevi, verrà dipinta l'intera linea.

Quindi si utilizza un singolo percorso, in cui si aggiungono solo segmenti di linea o si calcola per ogni nuovo sottotracciato dashPhase da cui avviare il motivo.

(? Non dovrebbe l'ultimo parametro di CGContextSetLineDash essere la lunghezza della dashLengths[], cioè 2)

UPDATE: Come abbiamo capito nella discussione, la soluzione al problema è stato infatti quello di aggiungere la linea segmenti fino all'ultimo tracciato di bezier fintanto che l'utente disegna la stessa curva:

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

Ho modificato alcuni bit in base ai commenti, ma comunque, quando disegno lentamente le linee tratteggiate si fondono tutte insieme –

+0

@ d3v3l0p3r101: cosa significa "disegnare lentamente" esattamente? Puoi mostrare il codice aggiornato? –

+0

Molto probabilmente "disegnare lentamente" significa che i punti catturati sono visivamente vicini tra loro causando il problema che hai descritto. Penso che l'approccio ragionevole sarebbe quello di aggiungere segmenti al percorso, ridisegnando le parti precedenti, se necessario, per assicurarsi che i trattini siano disegnati correttamente. –

Problemi correlati