2012-10-22 19 views
5

Próbuję narysować linię przerywaną z CGContextSetLineDash.Rysowanie linii przerywanej za pomocą CGContextSetLineDash

Oto mój kod:

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

Jednak jeśli rysuję powoli, że linie przerywane nie pojawiają się (patrz szczyt obrazek poniżej), ale jeśli rysuję szybko, że nie pojawiają się (patrz spód obrazka poniżej).

enter image description here

Dlaczego tak się dzieje?

+1

Nie widzę, jak jest to związane z Xcode. –

Odpowiedz

4

Ustawiono dashPhase = 0., dlatego za każdym razem, gdy rozpoczynana jest nowa linia, wzór rozpoczyna się od segmentu pomalowanego na 30 jednostek, a następnie 30 niepomalowanych segmentów. Jeśli segmenty linii są krótkie, cała linia zostanie pomalowana.

Tak więc albo używasz pojedynczej ścieżki, do której dodajesz tylko segmenty liniowe, albo obliczasz dla każdej nowej ścieżki podrzędnej, gdzie dashPhase gdzie rozpocząć wzorzec.

(? Gdyby nie ostatni parametr CGContextSetLineDash mieć długość dashLengths[], tj 2)

UPDATE: Kiedy zorientowali się w dyskusji, rozwiązaniem problemu było rzeczywiście dodać linię segmenty do ostatniej ścieżki beziera, o ile użytkownik rysuje tę samą krzywą:

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

Zmieniłem kilka bitów na podstawie twoich komentarzy, ale nadal, kiedy rysuję powoli linie przerywane po prostu łączą się razem –

+0

@ d3v3l0p3r101: Co oznacza "rysowanie powoli" dokładnie? Czy możesz pokazać zaktualizowany kod? –

+0

Najprawdopodobniej "rysowanie powoli" oznacza, że ​​punkty przechwyciły wzrokowo blisko siebie, powodując problem, który opisałeś. Myślę, że rozsądnym podejściem byłoby dołączenie segmentów do ścieżki, w razie potrzeby ponowne rysowanie poprzednich części, aby upewnić się, że kreski są rysowane prawidłowo. –

Powiązane problemy