Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Drawing a dashed line with CGContextSetLineDash

I'm trying to draw a dashed line with CGContextSetLineDash.

Here's my code:

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

However, if I draw slowly, they dashed lines do not appear (see top of image below) but if I draw quickly, they do appear (see bottom of image below).

enter image description here

Why is this happening?

like image 296
James Anderson Avatar asked Oct 22 '12 17:10

James Anderson


1 Answers

You have set dashPhase = 0., therefore each time you start a new line, the pattern starts with a 30 unit painted segment, followed by a 30 unit unpainted segment. If the line segments are short, the entire line will be painted.

So either you use a single path, where you only append line segments, or you compute for each new subpath the dashPhase where to start the pattern.

(Shouldn't the last parameter of CGContextSetLineDash be the length of the dashLengths[], i.e. 2 ?)

UPDATE: As we figured out in the discussion, the solution to the problem was indeed to add line segments to the last bezier path as long as the user draws the same curve:

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    // ...
    // Compute nextPoint to draw ...
    UIBezierPath *lastPath = [self.paths lastObject]; 
    [lastPath addLineToPoint:self.nextPoint];
    // ...
}
like image 116
Martin R Avatar answered Sep 21 '22 21:09

Martin R