跳转至

绘制图形

CoreGraphics

CoreGraphics 是一个底层的绘图框架,提供了丰富的绘图功能。它直接操作图形上下文(CGContext),适用于需要精细控制绘图过程的情况。

优点:

  1. 灵活性高:可以精细控制绘图的每一个步骤。
  2. 功能强大:支持复杂的绘图操作,如路径、渐变、阴影、图像处理等。
  3. 直接操作图形上下文:适合需要对图形进行大量操作的情况。

缺点:

  1. 代码复杂:绘图代码相对复杂。
  2. 性能:在频繁重绘的情况下,性能可能不如 CAShapeLayer

CAShapeLayer 和 UIBezierPath

CAShapeLayerCALayer 的子类,用于绘制矢量图形。UIBezierPath 是一个用于定义矢量路径的类。两者结合使用,可以简化矢量图形的绘制。

优点:

  1. 易于使用:使用 UIBezierPath 定义路径,使用 CAShapeLayer 绘制路径,代码简洁。
  2. 性能高CAShapeLayer 是硬件加速的,适合需要高性能的动画和频繁重绘的情况。
  3. 动画支持CAShapeLayer 支持平滑的动画效果。

缺点: 1. 灵活性较低:不如 CoreGraphics 那么灵活,适合绘制简单的矢量图形。 2. 功能相对有限:不支持一些高级的图形处理操作,如复杂的图像处理。

代码比较

CoreGraphics

import UIKit

class CoreGraphicsView: UIView {
    override func draw(_ rect: CGRect) {
        guard let context = UIGraphicsGetCurrentContext() else { return }

        // 设置填充颜色
        context.setFillColor(UIColor.green.cgColor)

        // 绘制矩形
        context.fill(CGRect(x: 50, y: 50, width: 100, height: 100))

        // 设置线条颜色
        context.setStrokeColor(UIColor.orange.cgColor)
        context.setLineWidth(2.0)

        // 绘制折线
        context.move(to: CGPoint(x: 50, y: 200))
        context.addLine(to: CGPoint(x: 150, y: 300))
        context.strokePath()
    }
}

CAShapeLayer 和 UIBezierPath

import UIKit

class ShapeLayerView: UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupLayer()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setupLayer()
    }

    private func setupLayer() {
        // 创建矩形路径
        let rectPath = UIBezierPath(rect: CGRect(x: 50, y: 50, width: 100, height: 100))

        // 创建矩形图层
        let rectLayer = CAShapeLayer()
        rectLayer.path = rectPath.cgPath
        rectLayer.fillColor = UIColor.green.cgColor

        // 添加矩形图层到视图
        layer.addSublayer(rectLayer)

        // 创建折线路径
        let linePath = UIBezierPath()
        linePath.move(to: CGPoint(x: 50, y: 200))
        linePath.addLine(to: CGPoint(x: 150, y: 300))

        // 创建折线图层
        let lineLayer = CAShapeLayer()
        lineLayer.path = linePath.cgPath
        lineLayer.strokeColor = UIColor.orange.cgColor
        lineLayer.lineWidth = 2.0

        // 添加折线图层到视图
        layer.addSublayer(lineLayer)
    }
}

选择建议

  1. 简单矢量图形和动画:如果你需要绘制简单的矢量图形并且希望添加动画,建议使用 CAShapeLayerUIBezierPath
  2. 复杂图形和精细控制:如果你需要进行复杂的图形绘制和精细控制,建议使用 CoreGraphics