7

我正在尝试用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];

但是,如果我画得很慢,它们就不会出现虚线(见下图顶部),但如果我画得很快,它们会出现(见下图底部)。

在此处输入图像描述

为什么会这样?

4

1 回答 1

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];
    // ...
}
于 2012-10-22T17:58:18.403 回答