- 值类型结构体:所有 SwiftUI 视图都是遵守
View 协议的结构体 - 描述界面状态:视图定义应用界面在特定状态下的呈现方式
- 轻量级声明:视图结构体只包含界面描述,不存储实际渲染内容
- 链式调用:通过
.modifierName() 形式改变视图表现 - 不可变性:每次修饰符调用都返回新视图
- 作用范围:修饰符按声明顺序从内向外生效
- 组件化思维:通过简单视图组合构建复杂界面
- 隐式布局:组合视图自动适应父视图约束
- 高效复用:自定义视图可多次复用
Text("Hello Charts")
.font(.title)
.foregroundColor(.blue)
Image(systemName: "chart.bar.fill")
.imageScale(.large)
Circle()
.fill(Color.red)
.frame(width: 100, height: 100)
VStack {
Text("Sales")
BarChartView(data: salesData)
}
HStack {
LegendView()
PieChartView(data: categoryData)
}
ZStack {
ChartBackground()
LineChartView(data: trendData)
}
| 类别 | 示例修饰符 | 作用描述 |
|---|
| 布局 | .frame(), .padding() | 控制视图尺寸和间距 |
| 外观 | .foregroundColor(), .font() | 修改视觉样式 |
| 变换 | .rotationEffect(), .scale() | 几何变换 |
| 交互 | .onTapGesture(), .hoverEffect() | 添加交互能力 |
struct ChartCardModifier: ViewModifier {
func body(content: Content) -> some View {
content
.padding()
.background(Color(.systemBackground))
.cornerRadius(10)
.shadow(radius: 3)
}
}
LineChartView(data: data)
.modifier(ChartCardModifier())
struct DataPointView: View {
let value: Double
let maxValue: Double
var body: some View {
VStack {
Rectangle()
.fill(Color.blue)
.frame(width: 20, height: CGFloat(value/maxValue * 200))
Text("\(Int(value))")
.font(.caption)
}
}
}
struct BarChartView: View {
let data: [Double]
private var maxValue: Double {
data.max() ?? 1
}
var body: some View {
HStack(alignment: .bottom) {
ForEach(data.indices, id: \.self) { index in
DataPointView(value: data[index], maxValue: maxValue)
}
}
.padding()
}
}
- 提取子视图:将重复部分提取为独立视图
- 视图构建器:使用
@ViewBuilder 创建灵活容器 - 环境变量:通过
EnvironmentValues 共享配置
- 最小化重绘:使用
EquatableView 避免不必要刷新 - 懒加载:对大型列表使用
LazyVStack/LazyHStack - 绘制优化:复杂图形考虑使用
Canvas 或 Path
ChartView()
.border(Color.red)
let _ = Self._printChanges()
- 创建一个包含标题、图例和图表的组合视图
- 设计可复用的图表卡片修饰符
- 构建一个通过修饰符控制颜色的柱状图组件