SwiftUI 年度更新:Liquid Glass、性能飞跃与三维布局
What's new in SwiftUI
2025年6月9日
一句话判断
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")!))
}
}
}
最佳实践
-
立即迁移
UIRequiresFullscreen。iPadOS 26 中这个属性已标记为 deprecated,不移除的话你的 app 在窗口自由调整大小时会受限。 -
用 toolbar spacer API 控制工具栏分区。Liquid Glass 下工具栏项会 morph 动画,合理的分区布局直接影响转场效果。
-
给搜索设置 search role Tab。如果你的 app 把搜索作为一个独立目的地(像 App Store),设置 Tab role 为 search 后搜索 Tab 会与其他 Tab 分离并直接 morph 成搜索框。
-
用新的 SwiftUI Performance Instrument 排查性能。它有专门的 lane 显示长 body 更新和平台视图更新,比 Instruments 的通用 time profiler 更有针对性。
-
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 垃圾桶删除照片