2012-07-13 11 views
7

私はいくつかの特定の線パラメータで一度描く必要がある複雑なUIBezierCurveを持っていて、他の線パラメータとオーバーレイとして再び描画する必要がありますが、曲線の最後の部分は前の部分より少し短くする必要があります。UIBezierPathの独立したコピーを作成しますか?

これを行うには、最後の部分までaddLineToPoint:moveToPoint:でカーブを作成し、このカーブのコピーを作成して、元のカーブとコピーしたカーブで線の最終セグメントを別々に追加します。そして、元の曲線とコピーされた曲線を描きます。

問題は、期待通りに機能しないことです。 私はでカーブのコピーを作成します。

UIBezierPath* copyCurve = [originalCurve copy]; 

そして、私はその後originalCurveで行う描画、copyCurveにも適用されるので、私は、この曲線のいずれかの独立した描画を行うことはできません。

オリジナルとコピーのこの接続の理由は何ですか?どのようにして取り除くことができますか?

EDIT 1: 私が見つけた解決策は、次の方法でコピーを作成することです:

UIBezierPath* copyCurve=[UIBezierPath bezierPathWithCGPath:CGPathCreateMutableCopy(originalCurve.CGPath)]; 

これが正常に動作するので、多分問題は私が取得コピーの不変性であります

[originalCurve copy] 
+0

はあなた 'alloc' /'初期化を行いましたあなたのcopyCurve? – Dustin

+0

いいえ、ちょうど私の質問に書かれているもの... – BartoNaz

答えて

19

CGPathを使用して新しい同一パスを作成します。この特性は、時間内の任意の所与の時点でパスのスナップショットを含ん

path2 = [UIBezierPath bezierPathWithCGPath:path1.CGPath]; 

CGPathにプロパティドキュメントの状態となります。このプロパティを取得すると、Core Graphics関数に渡すことができる不変のパスオブジェクトが返されます。私たちが使用することができます

また: - - :答え@jrturtonに加えて

+0

私の質問の編集を見てください。不変のパスオブジェクトを変更することはできないと思われるので、おそらく私は変更可能なパスオブジェクトが必要です。 – BartoNaz

+2

CGPathは変更できませんが、CGPathで作成されたUIBezierPathオブジェクトは変更可能です。 – jrturton

+0

いいえ、申し訳ありません。それは実際に動作します。ありがとうございました! – BartoNaz

2

let path = UIBezierPath(ovalIn: pathRect) 
let newPath = path.cgPath.copy(strokingWithWidth: strokeWidth, lineCap: .butt, lineJoin: .miter, miterLimit: 0) 

enter image description here

Reference

+0

swift3のためにそれを更新してください。storkedArc = arc.copy(strokingWithWidth:5.0、lineCap:.butt、lineJoin:.miter、miterLimit:10) –

関連する問題