用 Xcode Previews 构建声明式 UI
Build programmatic UI with Xcode Previews
2023年6月5日
一句话判断
Xcode Previews 不仅仅是看 UI,它还是你迭代设计和调试最快的方式。
这场 Session 讲了什么
Session 深入讲解了 Xcode Previews 的工作原理和最佳实践。Preview 是一段编译进 app 的代码,可以访问项目中的所有符号和资源。当你在源文件顶层使用 #Preview 宏定义 preview 时,Xcode 会自动构建并展示结果。
Previews 支持三种模式:Live 模式(默认,可交互,支持动画和异步代码)、Selection 模式(静态快照,可点击元素定位到源码)和 Variants 模式(同时展示不同配色、动态类型大小等变体)。
内容类型分为两类:Views(SwiftUI、UIKit、AppKit)和 Widgets。SwiftUI 视图直接返回即可。UIKit 返回 UIViewController 或 UIView。AppKit 返回 NSViewController 或 NSView。Widget 使用 WidgetConfiguration 和 preview context。
Device Settings 面板可以快速切换颜色方案、动态类型大小等,无需修改代码。Canvas 底部的控制按钮让你轻松在不同模式间切换。
值得深挖的点
Previews 和测试的类比很有启发。两者都运行真实代码,都帮助你更快地开发,都可以在不同层级工作。就像测试有 UI 测试和单元测试,Previews 也有覆盖大量功能的场景 preview 和专注于单个组件的 leaf preview。
Variants 模式是一个强大的工具。它可以同时展示你的 UI 在浅色/深色模式、不同动态类型大小下的表现,而不需要写多份代码。这对于确保 UI 在各种配置下都正确非常有用。
代码片段
// SwiftUI Preview
#Preview {
FilterView(image: sampleImage)
}
// 配置名称和特性
#Preview("Landscape", traits: .landscapeLeft) {
FilterView(image: sampleImage)
}
// UIKit Preview
#Preview {
let vc = MyViewController()
return vc
}
// Variants - 同时查看多种配置
// 在 Canvas 底部选择 Variants 模式
// 自动展示不同配色、动态类型等变体
// Widget Preview
#Preview(as: .systemSmall) {
MyWidgetEntryView(entry: .sample)
} timeline: {
MyTimelineProvider().getTimeline(in: .current)
}
最佳实践
- 从 leaf view 的 preview 开始,逐步构建更复杂的场景
- 使用 Device Settings 快速切换颜色方案和动态类型
- 利用 Variants 模式同时检查多种 UI 配置
- Preview 就像 scene 的入口,在这里设置数据和依赖
- Selection 模式帮助你从 UI 元素快速定位到源码
还有什么值得关注
- Canvas 模式默认在新项目中启用,旧项目需要手动开启
- Previews 编译进 app,可以访问所有项目资源
- Xcode 只重新编译变更的最小代码量
- 参考 Widget 相关 session 了解 Widget Preview 的细节