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 に答える