What's new in SwiftUI
Swift & UI 进阶 20m

SwiftUI 新特性一览

What's new in SwiftUI

2023年6月5日

在 Apple 官方观看视频

一句话判断

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 上运行的能力越来越强。
WWDC 2023