9

複雑な UIBezierCurve があり、特定の線パラメーターを使用して一度描画し、他の線パラメーターを使用してオーバーレイとして再度描画する必要がありますが、曲線の最後の部分を前のものよりもわずかに短くする必要があります。

これを行うには、最後の部分までで曲線を作成しaddLineToPoint:moveToPoint:この曲線のコピーを作成して、元の曲線とコピーされた曲線で異なる線の最終セグメントを追加します。次に、元のカーブとコピーしたカーブをストロークします。

問題は、期待どおりに機能しないことです。次の方法で曲線のコピーを作成します。

UIBezierPath* copyCurve = [originalCurve copy];

その後、originalCurve で行った描画が copyCurve にも適用されるため、この曲線を個別に描画することはできません。

オリジナルとコピーの間のこの接続の理由は何ですか?どうすればそれを取り除くことができますか?

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

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

これは適切に機能するため、取得したコピーの不変性に問題がある可能性があります

[originalCurve copy]
4

3 に答える 3

24

CGPathを使用して、新しい同一のパスを作成します。

path2 = [UIBezierPath bezierPathWithCGPath:path1.CGPath];

CGPathプロパティのドキュメントには次のように記載されています。

このプロパティには、任意の時点でのパスのスナップショットが含まれます。このプロパティを取得すると、CoreGraphics関数に渡すことができる不変のパスオブジェクトが返されます。

于 2012-07-13T14:37:35.637 に答える
4

copy()Swift 4の時点でうまく機能します。

let copiedPath = originalPath.copy() as! UIBezierPath
copiedPath.addLine(...)

originalPath変更されません。

于 2019-02-15T23:13:43.637 に答える
2

@jrturtonの回答に加えて:-

または、次を使用できます:-

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

ここに画像の説明を入力

参照

于 2016-12-12T10:53:18.693 に答える