CGMutablePath 是 Core Graphics 框架中的一个类,用来创建和编辑可变的二维绘图路径,可以添加线条、圆弧、矩形等。它是 CGPath 的可变版本。
let path = CGMutablePath()
CGPath:不可变的路径,用于绘图。
CGMutablePath:可变的路径,可以一步步添加图形。

最终可以将 CGMutablePath 转换成 CGPath(Core Graphics 使用的是 CGPath)。
示例代码
1、绘制线条
let path = CGMutablePath()
path.move(to: CGPoint(x: 10, y: 10))
path.addLine(to: CGPoint(x: 100, y: 100))
path.closeSubpath()
let shapeLayer = CAShapeLayer()
shapeLayer.path = path
shapeLayer.strokeColor = NSColor.systemBlue.cgColor
shapeLayer.fillColor = NSColor.blue.cgColor
shapeLayer.lineWidth = 10

2、多个图像
let path = CGMutablePath()
// 添加一个矩形
path.addRect(CGRect(x: 50, y: 50, width: 100, height: 100))
// 再添加一个圆角矩形
path.addRoundedRect(in: CGRect(x: 100, y: 100, width: 150, height: 100), cornerWidth: 10, cornerHeight: 10)
// 转换为 CGPath 给 CAShapeLayer 用
let shapeLayer = CAShapeLayer()
shapeLayer.path = path

3、设置中间挖空效果
let path = CGMutablePath()
path.addRect(CGRect(x: 50, y: 50, width: 100, height: 100))
path.addRoundedRect(in: CGRect(x: 100, y: 100, width: 150, height: 100), cornerWidth: 10, cornerHeight: 10)
selectionLayer.path = path
selectionLayer.fillRule = .evenOdd // 奇偶规则

常用方法
1、addRect(_:):添加矩形;
2、addEllipse(in:):添加椭圆或圆;
3、addRoundedRect(in:cornerWidth:cornerHeight:):添加圆角矩形;
4、move(to:):移动当前点(开始新路径);
5、addLine(to:):添加线段;
6、addArc(…):添加圆弧;
7、closeSubpath():闭合当前子路径;
8、addPath(_:transform:):添加已有路径,可加变换;
9、addCurve(to:control1:control2:):添加贝塞尔曲线(曲线段);
10、addQuadCurve(to:control:):添加二次贝塞尔曲线;
11、addPath(_:transform:):合并其他路径。
12、isEmpty:路径是否为空;
13、boundingBox:获取路径的外包矩形(未考虑曲线);
14、contains(_:using:transform:):判断某个点是否在路径内部。
常见用途
用于构建复杂形状路径,例如:
1、绘制一个选区框;
2、绘制一个挖空效果(两个矩形,一个作为“洞”);
3、提供给 CAShapeLayer.path 作为路径。
总结
和CGPath相比,CGMutablePath是可变路径,但也因为是动态构造路径,需要手动保护线程安全。