SwiftUI 新特性一览
What's new in SwiftUI
2023年6月5日
一句话判断
SwiftUI 今年最大的扩展是覆盖了三个全新领域——空间计算(visionOS 的 3D 体积和沉浸式空间)、watchOS 10 的全屏重设计、以及交互式 Widget,加上 Inspector、滚动改进、动画增强等框架级更新。
这场 Session 讲了什么
SwiftUI 团队的 Curt Clifton 和 Jeff Robertson 全面介绍了 SwiftUI 在 2023 年的更新,覆盖范围极其广泛。
空间计算:SwiftUI 是 visionOS 应用的核心框架。WindowGroup 渲染为 2D 窗口,Volumetric 样式显示 3D 体验(如棋盘游戏或建筑模型),ImmersiveSpace 定义沉浸式空间体验。RealityView 用于动态交互式 3D 内容,Model3D 用于静态模型展示。
watchOS 10 重设计:NavigationSplitView、NavigationStack 获得新的转场动画。TabView 新增垂直翻页样式,由 Digital Crown 驱动。containerBackground 修饰符配置背景。DatePicker 和 List 选择功能首次登陆 watchOS。
交互式 Widget:Toggle 和 Button 现在可以在 Widget 中触发 App Intents。支持动画过渡。Xcode Previews 利用 Swift 5.9 宏提供新的预览语法,可以查看 Widget 时间线动画。
数据流和 UI 改进:新的 Observation 框架大幅简化数据流。Inspector 视图和 Table 改进。ScrollView 增强。动画 API 升级。Focus 和键盘输入精细化。按钮和菜单的深度自定义。
跨框架集成:MapKit for SwiftUI 大更新、Swift Charts 新增饼图和甜甜圈图、StoreKit for SwiftUI 的内购订阅商店视图。
值得深挖的点
三种空间计算场景类型:WindowGroup(2D 窗口)、Volume(有边界的 3D 体验,与其他应用并列显示)、ImmersiveSpace(完全沉浸式,系统会把其他应用移走)。这三种类型对应不同的使用场景,从信息展示到游戏到沉浸式体验。
Widget 的交互能力质变:之前 Widget 只能展示信息,现在通过 App Intents 可以直接执行应用代码。这意味着 Widget 从”信息卡片”进化为”功能入口”。
Xcode Previews 的新语法:基于 Swift 5.9 宏的 Preview 声明方式更简洁。对于 Widget,可以定义时间线来测试不同状态之间的动画效果。Mac 应用现在可以在 Xcode 内部交互式预览。
MapKit for SwiftUI 的全面性:不是简单的封装,而是完整的 SwiftUI 原生地图框架——自定义标记、折线叠加、用户位置、控件配置全部支持。
代码片段
// visionOS - 3D 体积场景
WindowGroup {
ContentView()
}
.windowStyle(.volumetric)
// 体积内使用 RealityView 展示交互式 3D 内容
RealityView { content in
let model = ModelEntity(mesh: .generateBox(size: 0.2))
content.add(model)
}
// watchOS 10 - 新的垂直翻页 TabView
TabView {
Tab("Stats", systemImage: "chart.bar") {
StatsView()
}
Tab("Timer", systemImage: "timer") {
TimerView()
}
}
.tabViewStyle(.verticalPage)
// 交互式 Widget - 按钮触发 App Intent
struct MyAppWidget: Widget {
var body: some WidgetConfiguration {
StaticConfiguration(kind: "MyWidget") { entry in
VStack {
Text(entry.title)
Button(intent: MarkDoneIntent()) {
Text("标记完成")
}
}
.containerBackground(for: .widget) {
Color.blue.opacity(0.1)
}
}
}
}
// 新的 Preview 宏语法
#Preview("Widget Timeline") {
MyWidget()
.previewContext(WidgetPreviewContext(
flavors: .several(
[.systemSmall, .systemMedium],
timeline: [
.now,
.date(.now.addingTimeInterval(3600))
]
)
))
}
最佳实践
- 空间计算应用从 WindowGroup 开始:不需要一上来就做沉浸式体验。先在 2D 窗口中做好核心功能,再逐步添加 3D 和沉浸式元素。
- watchOS 应用利用新的全屏设计:watchOS 10 的设计语言强调全屏色彩和图像。用 containerBackground 配置背景,用新的 toolbar placement 放置控件。
- Widget 开发用新的 Preview 工具:Xcode Previews 的 Widget 时间线功能让你在不运行应用的情况下测试 Widget 的所有状态和动画。
- 跨平台应用统一使用 SwiftUI:从 visionOS 到 watchOS,SwiftUI 现在是所有 Apple 平台的首选 UI 框架。
- 关注 MapKit 和 Swift Charts 的 SwiftUI 集成:这两个框架的 SwiftUI 原生支持意味着你不再需要 UIViewRepresentable/NSViewRepresentable 桥接。
还有什么值得关注
- SwiftUI 现在是 Apple 自身系统应用的核心框架——控制中心、TV、Safari、Freeform、Keynote 都在用。这说明 SwiftUI 已经足够成熟,可以支撑复杂的生产级应用。
- Session 提到了 “Explore pie charts and interactivity in Swift Charts” 和 “Meet StoreKit for SwiftUI” 等配套 Session,值得深入看。
- Observation 框架(@Observable 宏)是今年数据流最大的变化,建议配合 “Discover Observation with SwiftUI” Session 一起理解。
- watchOS 10 的 Widget 出现在 Smart Stack 中,这是 watchOS 应用触达用户的新途径。
- SwiftUI 的跨平台一致性在持续提升,一份代码在 iPhone、iPad、Mac、Watch、TV 和 visionOS 上运行的能力越来越强。