0Pricing
Swift Academy · 课时

使用 Core Graphics 自定义绘图

在 draw(_:) 中绘制路径和形状。

使用 Core Graphics 自定义绘图 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。

何时绘制自定义内容

当图层和图像无法表达某种形状时,例如图表、签名和自定义控件,您可以使用 Core Graphics(Quartz 2D)自行绘制。

重写 draw(_:)

继承 UIView 并重写 draw(_:)。UIKit 会将配置好的上下文传入该方法,您可以在那里发出绘制命令。

import UIKit
final class ChartView: UIView {
    override func draw(_ rect: CGRect) {
        // drawing commands go here
    }
}

图形上下文

在 draw(_:) 内部获取当前的 CGContext。它是一个有状态的画布:您先设置颜色和线宽,然后进行描边或填充。

override func draw(_ rect: CGRect) {
    guard let ctx = UIGraphicsGetCurrentContext() else { return }
    ctx.setFillColor(UIColor.systemTeal.cgColor)
    ctx.fill(rect)
}

构建路径

CGPath(或 UIBezierPath)用于描述直线、曲线和形状。请先移动到起点,然后添加直线和曲线。

let path = UIBezierPath()
path.move(to: CGPoint(x: 0, y: 0))
path.addLine(to: CGPoint(x: 100, y: 50))
path.addLine(to: CGPoint(x: 0, y: 100))
path.close()

描边与填充

描边会勾勒路径的轮廓,填充会为其内部着色。请设置颜色和宽度,然后调用 stroke() 或 fill()。

UIColor.systemRed.setStroke()
let line = UIBezierPath()
line.lineWidth = 3
line.move(to: CGPoint(x: 10, y: 10))
line.addLine(to: CGPoint(x: 90, y: 90))
line.stroke()

曲线

通过二次(addQuadCurve)或三次(addCurve)贝塞尔线段并指定控制点,即可添加平滑曲线。

let p = UIBezierPath()
p.move(to: CGPoint(x: 0, y: 100))
p.addCurve(to: CGPoint(x: 200, y: 100),
           controlPoint1: CGPoint(x: 50, y: 0),
           controlPoint2: CGPoint(x: 150, y: 200))

上下文状态:保存与恢复

上下文是有状态的。请将变换和裁剪包裹在 saveGState()/restoreGState() 中,避免更改影响后续绘制。

ctx.saveGState()
ctx.translateBy(x: 50, y: 50)
ctx.rotate(by: .pi / 4)
// draw rotated content
ctx.restoreGState()

渐变与阴影

Core Graphics 可以直接在上下文中绘制渐变(使用 CGGradient 和 drawLinearGradient)以及阴影(使用 setShadow(offset:blur:color:))。

ctx.setShadow(offset: CGSize(width: 0, height: 2),
              blur: 4,
              color: UIColor.black.cgColor)

裁剪

添加路径并调用 clip(),即可将后续绘制限制在该区域内,这对圆角图像或遮罩填充很有用。

let clipPath = UIBezierPath(ovalIn: rect)
clipPath.addClip()
// drawing now constrained to the oval

性能与 setNeedsDisplay

draw(_:) 在 CPU 上运行,开销相对较大。请仅在需要时通过 setNeedsDisplay() 触发重绘,并保持绘制代码精简。

func updateData() {
    self.data = newData
    setNeedsDisplay() // schedule one redraw
}

离屏渲染

对于可复用的位图,请使用 UIGraphicsImageRenderer 将内容渲染到图像中,而不是在每一帧都重新绘制。

let renderer = UIGraphicsImageRenderer(size: CGSize(width: 100, height: 100))
let image = renderer.image { ctx in
    UIColor.systemBlue.setFill()
    ctx.fill(CGRect(x: 0, y: 0, width: 100, height: 100))
}

快速检查:Core Graphics

请检验您对自定义绘制的理解。

回顾:使用 Core Graphics 自定义绘制

重写 draw(_:) 并向 CGContext 发出命令:使用直线和贝塞尔曲线构建路径,然后进行描边或填充。使用 saveGState()/restoreGState() 隔离变换和裁剪,并直接添加渐变、阴影和裁剪区域。

绘制会占用 CPU,因此只通过 setNeedsDisplay() 在需要时重绘,并使用 UIGraphicsImageRenderer 缓存可复用的位图。

常见问题解答

「使用 Core Graphics 自定义绘图」课时是免费的吗?

是的 — 「使用 Core Graphics 自定义绘图」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。

「使用 Core Graphics 自定义绘图」这节课中我会学到什么?

在 draw(_:) 中绘制路径和形状。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「使用 Core Graphics 自定义绘图」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. CALayer 基础
  2. 隐式与显式动画
  3. 变换与三维效果
  4. 使用 Core Graphics 自定义绘图
← 返回 Swift Academy