What's new in SwiftUI
Developer Tools 进阶 1m

SwiftUI 年度更新:Liquid Glass、性能飞跃与三维布局

What's new in SwiftUI

2025年6月9日

在 Apple 官方观看视频

一句话判断

SwiftUI 今年的更新覆盖了从视觉到性能到生态的全链路——Liquid Glass 设计语言让你重新编译就焕然一新,列表性能提升 16 倍,WebView 和富文本终于官方支持,visionOS 三维布局正式成型。

这场 Session 讲了什么

Anna 和 Peter 用一个徒步旅行规划 app 串联了所有更新,分四个板块展开:

新设计系统 Liquid Glass:重新编译后自动获得全新外观。侧边栏变为玻璃质感,iPhone 上的 Tab Bar 更紧凑。工具栏项支持 Liquid Glass 着色,滚动时边缘自动应用模糊效果确保可读性。搜索在 iPhone 上移至底部更符合人体工学,在 iPad 上移至右上角。搜索 Tab 与普通 Tab 分离,点击后直接 morph 成搜索框。

框架基础增强:macOS 上 10 万+条目的列表加载快 6 倍、更新快 16 倍。滚动调度优化减少了高帧率下的掉帧。嵌套 ScrollView + LazyStack 现在也能延迟加载。新增 SwiftUI Performance Instrument 可以定位长 body 更新和平台视图更新的问题。@Animatable 宏自动合成动画属性,用 @AnimatableIgnored 排除不需要动画的属性。

SwiftUI 跨系统扩展:Scene Bridging 允许 UIKit/AppKit 应用直接使用 SwiftUI 场景类型(MenuBarExtra、ImmersiveSpace)。新增 RemoteImmersiveSpace 让 Mac 应用在 Vision Pro 上渲染立体内容。AssistiveAccess 场景类型支持认知障碍辅助模式。watchOS 和 macOS 获得自定义 Controls。Widgets 扩展到 visionOS 和 CarPlay。

视图能力扩展:WebView 正式加入 SwiftUI,由 WebKit 驱动,配合 WebPage 可编程导航和页面属性访问。Swift Charts 支持 3D 图表(Chart3D)。Drag and Drop 大幅增强:多选拖拽、懒加载拖拽项、拖拽配置 API(支持删除操作)、堆叠预览。TextEditor 支持 AttributedString 绑定实现富文本编辑。

值得深挖的点

Scene Bridging 是渐进式迁移的杀手锏。你不需要重写整个 UIKit/AppKit 应用来使用 SwiftUI 独有的场景类型。直接在 UIKit 代码中声明 SwiftUI Scene,包括窗口恢复、样式修饰符都能工作。这解决了一个长期存在的痛点:想用 SwiftUI 的 MenuBarExtra 但不想重写整个应用。

性能改进的重点在列表和滚动。10 万条目列表更新快 16 倍这个数字很震撼,但更值得关注的是嵌套 ScrollView + LazyStack 的延迟加载——这在横向照片轮播嵌套在纵向滚动页的场景中非常常见,之前外层 ScrollView 滚动时内层 LazyStack 的视图也会被提前加载。

WebView 的 API 设计很克制。WebView 接受 URL 或 WebPage,WebPage 是一个全新的 Observable 类型,支持编程化导航和属性访问。这种设计让你可以在 SwiftUI 的数据流中自然地与网页交互,而不是用 delegate 回调。

代码片段

// Animatable 宏简化动画声明
struct LoadingShape: Shape, Animatable {
    var progress: Double
    @AnimatableIgnored var drawReversed: Bool = false

    // 不再需要手动实现 animatableData
    // @Animatable 自动合成

    func path(in rect: CGRect) -> Path {
        // 根据 progress 绘制路径
    }
}

// Scene Bridging:在 UIKit 中使用 SwiftUI 场景
// 直接在 UIKit App 中声明 SwiftUI Scene
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    var windowScene: UIWindowScene?

    func application(
        _ application: UIApplication,
        configurationForConnecting connectingSceneSession: UISceneSession
    ) -> UISceneConfiguration {
        // SwiftUI 场景可与 UIKit 窗口共存
    }
}

// WebView 基础用法
struct ArticleView: View {
    var body: some View {
        WebView(url: URL(string: "https://example.com")!)
    }
}

// WebView + WebPage 编程化控制
struct InteractiveWebView: View {
    @State private var page = WebPage()

    var body: some View {
        WebView(page: page)
            .onAppear {
                page.load(URLRequest(url: URL(string: "https://example.com")!))
            }
    }
}

最佳实践

  1. 立即迁移 UIRequiresFullscreen。iPadOS 26 中这个属性已标记为 deprecated,不移除的话你的 app 在窗口自由调整大小时会受限。

  2. 用 toolbar spacer API 控制工具栏分区。Liquid Glass 下工具栏项会 morph 动画,合理的分区布局直接影响转场效果。

  3. 给搜索设置 search role Tab。如果你的 app 把搜索作为一个独立目的地(像 App Store),设置 Tab role 为 search 后搜索 Tab 会与其他 Tab 分离并直接 morph 成搜索框。

  4. 用新的 SwiftUI Performance Instrument 排查性能。它有专门的 lane 显示长 body 更新和平台视图更新,比 Instruments 的通用 time profiler 更有针对性。

  5. WebView 场景优先用 WebPage Observable。不要只传 URL 然后用 JavaScript bridge 做交互——WebPage 提供了更 Swift 化的编程接口。

还有什么值得关注

  • 窗口 resize anchor 可以控制 macOS 窗口调整大小时的动画起点,切换 tab 时保持视觉连续性
  • iPadOS 26 的菜单栏通过 swipe down 手势唤起,用 macOS 的 commands API 构建
  • RealityKit Entity 现在遵循 Observable,可以直接在 SwiftUI 视图中观察变化
  • visionOS 的 levelOfDetail 环境值让 Widget 在近距离时展开更多内容
  • 3D Charts 支持 Z 轴修饰符,可以做海拔高度的正弦曲线图
  • DragConfiguration API 支持声明删除操作,配合 onDragSessionUpdated 实现拖到 Dock 垃圾桶删除照片
开发工具 基础 空间计算 SwiftUI