2012-07-13 78 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