我正在尝试用CGContextSetLineDash
画一条虚线。
这是我的代码:
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];
然而,如果我画得很慢,它们的虚线就不会出现(见下图的顶部)但是如果我快速绘制,它们会出现(见下图的底部)。
为什么会这样?
答案 0 :(得分:4)
您已设置dashPhase = 0.
,因此每次开始换行时,图案都会以30个单位绘制的段开头,然后是30个单位未上漆的段。如果线段很短,则整个线都会被绘制。
因此,要么使用单个路径,只附加线段,要么为每个新子路径计算dashPhase
启动模式的位置。
(CGContextSetLineDash
的最后一个参数不应该是dashLengths[]
的长度,即2
吗?)
更新:正如我们在讨论中所发现的那样,只要用户绘制相同的曲线,问题的解决方案确实是将线段添加到最后一个贝塞尔曲线路径:
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
// ...
// Compute nextPoint to draw ...
UIBezierPath *lastPath = [self.paths lastObject];
[lastPath addLineToPoint:self.nextPoint];
// ...
}