Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 视图、修饰符和组合

视图、修饰符和组合

基本概念

SwiftUI 视图的本质

  • 值类型结构体:所有 SwiftUI 视图都是遵守 View 协议的结构体
  • 描述界面状态:视图定义应用界面在特定状态下的呈现方式
  • 轻量级声明:视图结构体只包含界面描述,不存储实际渲染内容

修饰符(Modifiers)

  • 链式调用:通过 .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()
    }
}

组合技巧

  1. 提取子视图:将重复部分提取为独立视图
  2. 视图构建器:使用 @ViewBuilder 创建灵活容器
  3. 环境变量:通过 EnvironmentValues 共享配置

性能考虑

高效视图设计原则

  • 最小化重绘:使用 EquatableView 避免不必要刷新
  • 懒加载:对大型列表使用 LazyVStack/LazyHStack
  • 绘制优化:复杂图形考虑使用 Canvas 或 Path

调试工具

// 添加调试边框
ChartView()
    .border(Color.red)

// 打印视图类型
let _ = Self._printChanges()

练习建议

  1. 创建一个包含标题、图例和图表的组合视图
  2. 设计可复用的图表卡片修饰符
  3. 构建一个通过修饰符控制颜色的柱状图组件
Last Updated:: 5/18/25, 10:02 AM