2012-10-22 13 views
5

私はCGContextSetLineDashで破線を描こうとしています。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]; 

私はゆっくり描く場合は、彼らはラインが(下の画像の上を参照)は表示されませんが、私はすぐに描画した場合、彼らは(下の画像の一番下を参照してください表示されない破線)。

enter image description here

なぜこの出来事はありますか?

+1

これはXcodeにどのように関連しているのでしょうか。 –

答えて

4

dashPhase = 0.を設定しました。したがって、改行を開始するたびに、パターンは30単位の塗装セグメントから始まり、その後に30単位の塗装されていないセグメントが続きます。線分が短い場合、線全体がペイントされます。

したがって、線分を追加するだけの単一パスを使用するか、新しいサブパスごとにパターンを開始する場所をdashPhaseとして計算します。

(?CGContextSetLineDashの最後のパラメータは、すなわち、2dashLengths[]の長さはすべきではない)

UPDATE:私たちは議論に考え出したようは、問題を解決するには、行を追加するために、実際ましたユーザーが同じ曲線を描いている限り、最後のベジェパスにセグメントを移動します。

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

あなたのコメントに基づいていくつかのビットを変更しましたが、ゆっくりと描画すると破線はすべて一緒にマージされます –

+0

@ d3v3l0p3r101:正確には「ゆっくりと描画する」という意味ですか?更新されたコードを表示できますか? –

+0

ほとんどの場合、「ゆっくりと描画する」とは、ポイントが互いに視覚的に接近してキャプチャしたことを意味します。合理的なアプローチは、パスにセグメントを追加し、必要に応じて前の部分を再描画して、ダッシュが適切に描画されていることを確認することです。 –