使用CAShapeLayer时,用UIBezierPath比直接构造CGPath有优势吗?
我定义了如下RepairedCAShapeLayer实例:
private lazy var aLine: RepairedCAShapeLayer { let v = RepairedCAShapeLayer() v.contentsScale = UIScreen.main.scale v.strokeColor = cfp.color.cgColor v.fillColor = nil v.lineWidth = 2 v.lineJoin = .miter return v }
并在layoutSubviews方法中通过fancyBezDrawing()创建UIBezierPath后取其cgPath赋值给图层的path属性:
override func layoutSubviews() { super.layoutSubviews() aLine.path = fancyBezDrawing().cgPath }
其中fancyBezDrawing()是一段创建UIBezierPath的代码。我发现不少代码库及Stack Overflow示例都采用这种方式,但其实也可以直接通过fancyCGPDrawing()创建CGPath赋值:
override func layoutSubviews() { super.layoutSubviews() aLine.path = fancyCGPDrawing() }
想请教,针对图层使用场景,选择UIBezierPath而非直接构造CGPath是否存在我忽略的优势?
Swift语法适配性更强:
UIBezierPath是Swift原生封装的面向对象API,方法命名更贴合Swift习惯,比如move(to:)、addLine(to:)这类链式调用写法,比CGPath的C风格函数(如CGPathMoveToPoint)可读性更高,写起来更顺手。内存管理更省心:
UIBezierPath由ARC自动管理内存,不用手动处理CGPath这类CF对象的创建、释放逻辑,避免了手动操作内存可能出现的疏漏。自带便捷功能:
UIBezierPath封装了不少CGPath没有的实用能力,比如直接用contains(_:)判断点是否在路径内,apply(_:)应用几何变换;如果后续需要在draw(_:)方法里直接绘制路径,还能直接调用stroke()、fill()完成渲染,不用再额外处理CGPath的绘制逻辑。扩展性与维护性更好:作为面向对象的封装,
UIBezierPath更容易做扩展,比如给它写自定义扩展方法来封装复杂路径生成逻辑,后续修改或复用都更方便。容错性更优:UIBezierPath的方法对参数异常(比如无效坐标点)的处理更友好,而CGPath作为底层C API,出错时更易直接引发崩溃,排查成本更高。
内容的提问来源于stack exchange,提问作者Fattie

