9

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

为此,我想创建曲线addLineToPoint:moveToPoint:直到最后一部分,然后复制该曲线并在原始曲线和复制曲线中以不同方式添加线的最终段。然后我抚摸原始曲线和复制的曲线。

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

UIBezierPath* copyCurve = [originalCurve copy];

之后我在 originalCurve 中所做的绘图也应用于 copyCurve,因此我无法为任何这些曲线进行独立绘图。

原件和副本之间存在这种联系的原因是什么,我该如何摆脱它?

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

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

由于这工作正常,也许问题在于我得到的副本的不变性

[originalCurve copy]
4

3 回答 3

24

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

path2 = [UIBezierPath bezierPathWithCGPath:path1.CGPath];

CGPath 属性文档指出:

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

于 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 回答