2012-07-13 41 views
7

我有一個複雜的UIBezierCurve,我需要用一些特定的線參數繪製一次,然後再次繪製它作爲與其他線參數的疊加,但我也需要曲線的最後部分略短於前一部分。製作UIBezierPath的獨立副本?

要做到這一點,我想addLineToPoint:創建曲線,moveToPoint:直到最後一部分,然後讓這條曲線的副本,並在不同的原件和複製曲線添加行的最後部分。然後我撫摸原來的曲線和複製的曲線。

問題是它不能像我期望的那樣工作。 我創建通過曲線的副本:

UIBezierPath* copyCurve = [originalCurve copy]; 

和我做的originalCurve後的圖紙,也適用於copyCurve,所以我不能對任何這種曲線做無關的繪圖。

原創和複製之間的這種聯繫的原因是什麼,我該如何擺脫它?

編輯1: 我已經找到了一個解決方案是創建以下列方式複製:

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

因爲這工作正常,也許問題是在副本中我得到的不變性

[originalCurve copy] 
+0

你有沒有'alloc' /'初始化'你的copyCurve? – Dustin 2012-07-13 14:30:50

+0

不,只是寫在我的問題... – BartoNaz 2012-07-13 14:32:28

回答

19

通過使用CGPath創建一個新的,相同的路徑。

path2 = [UIBezierPath bezierPathWithCGPath:path1.CGPath]; 

的CGPath屬性文檔指出:

此屬性包含在任何給定時間點的路徑的快照。獲取此屬性將返回一個可以傳遞給Core Graphics函數的不可變路徑對象。

+0

請看看我編輯的問題。在我看來,我不能改變不可變的路徑對象,所以可能我需要可變的路徑對象。 – BartoNaz 2012-07-13 14:42:29

+2

您無法更改CGPath,但用CGPath製作的UIBezierPath對象是可變的。 – jrturton 2012-07-13 14:45:06

+0

不,對不起。真的行。謝謝! – BartoNaz 2012-07-13 14:45:43

2

除了@jrturton答案: -

或者我們可以使用: -

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

enter image description here

Reference

+0

更新爲swift 3 let storkedArc = arc.copy(strokingWithWidth:5.0,lineCap:.butt,lineJoin:.miter,miterLimit:10) – 2017-04-19 09:06:16