上一篇博客我们介绍了 SwiftUI 中的 @State
和 @Binding
控件,
今天我们来介绍 SwiftUI 中的 Path
和 Shape
控件。
在iOS开发中,很多资深开发者都使用过Core Graphics来绘制自定义的图形和控件。 随 着SwiftUI的兴起,Apple也为我们提供了强大的Path和Shape API, 可以用更简洁、更声明式的方式来绘制各种矢量图形。
在本教程中,你将学习如何使用SwiftUI的Path
和Shape
协议来绘制直线、弧线,
以及进阶的饼图与甜甜圈图表。
本教程主要涵盖:
- 理解
Path
类型,并在SwiftUI中绘制线条与形状 - 探索
Shape
协议,自定义绘制复杂形状 - 使用
Path.addArc
绘制弧线、饼图 - 创建基于
Circle
的进度指示器 - 利用
Circle().trim(from:to:)
绘制甜甜圈图表
通过阅读本文并练习其中的示例,你将能够更灵活地利用SwiftUI中的绘制功能,实现个性化的UI控件与数据可视化组件。
1. 认识 SwiftUI 的 Path
在SwiftUI中,我们可以使用 Path
结构体来绘制线条与形状。
正如Apple官方文档(参考)所述,
Path
代表了一个二维形状的轮廓,通过一系列绘制指令(点、线、弧等)来构建图形。
一个简单的矩形示例
让我们先来画一个矩形。在传统的描述方式中,若要画一个矩形,你可能会按照下面的步骤来描述:
- 从坐标
(20, 20)
开始。 - 画一条线到
(300, 20)
。 - 接着画一条线到
(300, 200)
。 - 再画一条线到
(20, 200)
。 - 最后用绿色进行填充。
那么,这些口述步骤在SwiftUI中如何实现呢?
看如下代码:
Path() { path in
path.move(to: CGPoint(x: 20, y: 20))
path.addLine(to: CGPoint(x: 300, y: 20))
path.addLine(to: CGPoint(x: 300, y: 200))
path.addLine(to: CGPoint(x: 20, y: 200))
}
.fill(.green)
在这里,我们使用Path
的初始化方法,传入一个闭包来进行绘制指令:
move(to:)
: 用于移动画笔到指定坐标。addLine(to:)
: 用于从当前点到指定点绘制线段。.fill(.green)
: 则表示我们将形状用绿色进行填充。
将此代码放入Xcode的预览里,你就能看到一个绿色的矩形。
2. 使用 Stroke 来绘制边框
如果你只想绘制矩形的轮廓而不填充它,可以使用 .stroke
修饰符:
Path() { path in
path.move(to: CGPoint(x: 20, y: 20))
path.addLine(to: CGPoint(x: 300, y: 20))
path.addLine(to: CGPoint(x: 300, y: 200))
path.addLine(to: CGPoint(x: 20, y: 200))
path.closeSubpath()
}
.stroke(.green, lineWidth: 10)
closeSubpath()
: 会自动将当前点连接回起始点,从而闭合路径形成一个完整的矩形。.stroke(.green, lineWidth: 10)
: 用于给图形描边,同时可以指定颜色和线条粗细。
如果去掉 closeSubpath()
,最后一个角到起始点的线段就不会被绘制。