制作UIBezierPath的独立副本?

时间:2012-07-13 14:10:58

标签: objective-c cocoa drawing copy uibezierpath

我有一个复杂的UIBezierCurve,我需要用一些特定的线参数绘制一次,然后再次绘制它作为与其他线参数的叠加,但我还需要曲线的最后部分比前一个略短

要执行此操作,我希望按addLineToPoint:创建曲线,moveToPoint:直到最后一部分,然后制作此曲线的副本,并以原始和复制的方式添加不同行的最后一段曲线。然后我抚摸原始曲线和复制曲线。

问题是它不能像我预期的那样工作。 我通过以下方式创建曲线的副本:

UIBezierPath* copyCurve = [originalCurve copy];

之后我在originalCurve中所做的绘图也应用于copyCurve,所以我无法对任何曲线进行独立绘制。

原始版本和副本之间存在这种联系的原因是什么?如何摆脱它?

编辑1: 我发现的解决方案是以下列方式创建副本:

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

由于这种方法正常,可能问题在于我用

复制的副本的不变性
[originalCurve copy]

3 个答案:

答案 0 :(得分:21)

使用CGPath创建一个新的相同路径。

path2 = [UIBezierPath bezierPathWithCGPath:path1.CGPath];

CGPath属性docs声明:

  

此属性包含任何给定时间点的路径快照。获取此属性将返回一个可传递给Core Graphics函数的不可变路径对象。

答案 1 :(得分: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

答案 2 :(得分:0)

|从Swift 4开始对我来说很好用。

sed

copy()未被修改。