CAShapeLayer 和drawRect 绘制图形的区别

一般都是使用CAShapeLayer 绘制图形, 今天突然看到使用 drawRect 绘制图片, 在想两个异同点. 为什么shapeLayer 会成为主流的结合贝塞尔曲线绘制图形

  override func draw(in ctx: CGContext) {
    let red = UIColor.red
    red.set()
    //绘制矩形
    let rectPath = UIBezierPath(rect: CGRect(x: position.x - 30, y: position.y - 30, width: 60, height: 60))
   
    ctx.addPath(rectPath.cgPath)
    ctx.setStrokeColor(UIColor.orange.cgColor)
    ctx.setLineWidth(1.0)
    ctx.strokePath()
   
    let shapeLayer = CAShapeLayer()
    shapeLayer.frame = CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)
    shapeLayer.path = rectPath.cgPath
    shapeLayer.strokeColor = UIColor.red.cgColor

    shapeLayer.lineWidth = 2
    self.addSublayer(shapeLayer)

}

drawRect: 属于 CoreGraphics框架, 占用CPU, 性能消耗大
CAShapeLayer : 属于 CoreAnimation 框架, 通过GPU来渲染图形, 节省性能. 动画渲染直接交给手机GPU, 不消耗内存

CAShapeLayer 与 UIBezierPath的关系

CAShapeLayer 中的shaper代表形状, 所以需要形状才能生效
贝塞尔曲线可以创建基于矢量的路径, 而 UIBezierPath类 是对 CGPathRef的封装, 贝塞尔曲线 给CAShapeLayer提供路径, CAShapeLayer 在提供的路径中进行渲染, 路径会闭环, 所以绘制除了shape
用于CAShapeLayer的贝塞尔曲线作为path,其path是一个首尾相接的闭环的曲线,即使该贝塞尔曲线不是一个闭环的曲线

你可能感兴趣的:(CAShapeLayer 和drawRect 绘制图形的区别)