用 SwiftUI 构建全新设计风格的应用
Build a SwiftUI app with the new design
2025年6月9日
一句话判断
如果你只看一个关于 Liquid Glass 和新设计系统的 session,就是这个——它是 SwiftUI 新设计的「实操手册」,从 app 结构到自定义 glass 效果全覆盖。
这场 Session 讲了什么
Franck 以 Landmarks 示例项目为主线,用 iOS 26 / macOS Tahoe 的新 SDK 重新构建了一遍 app,系统性地展示了五个层面的变更:
1. App 结构(NavigationSplitView / TabView / Sheets)
- NavigationSplitView 的 sidebar 现在是 Liquid Glass 材质,浮在内容之上。
- 新增
backgroundExtensionEffectmodifier,让 hero 图片可以延伸到 safe area 外面做镜像模糊,不再被 sidebar 裁切。 - TabView 的 tab bar 在 iPhone 上变为悬浮式,支持
tabBarMinimizeBehavior配置滚动时的收起策略(如onScrollDown)。 - 新增
tabViewBottomAccessory,可以在 tab bar 上方放置额外控件(比如 Music 的播放条),利用 bar 收起时腾出的空间。 - Sheet 在 iOS 26 上默认内嵌、带 Liquid Glass 背景,从按钮直接 morph 出来(配合 navigation zoom transition)。
2. Toolbars
- 工具栏项自动分组。新增
ToolbarSpacer(fixed/flexible)控制分组间距。 sharedBackgroundVisibility让某些 item 脱离背景组(比如头像)。- 工具栏 item 支持
badgemodifier。 - 图标默认 monochrome 渲染,减少视觉噪音。
- 新增 automatic scroll edge effect,保证浮动控件在内容上方的可读性。
3. Search
- 搜索栏在 toolbar placement 时自动适配:iPhone 底部、iPad/Mac 顶部。
- 多 tab app 支持 dedicated search tab:设置
searchrole,搜索框替代 tab bar。 searchToolbarBehavior可显式 opt-in 最小化搜索框。
4. Controls
- 按钮默认 capsule shape;macOS 的 mini/small/medium 保留圆角矩形。
- macOS 控件整体增高,增大点击目标。
- 新增 extra large button size、
glass/glassProminentbutton style。 - Slider 支持 tick marks(
step参数自动生成)、neutralValue设置填充起点。 - Menu 在各平台统一布局,图标在 leading edge。
- 新增
concentricRectangleshape 实现角同心性(corner concentricity)。
5. 自定义 Liquid Glass 效果
glassEffectmodifier 给任意 view 加玻璃效果,默认 capsule shape。interactivemodifier 让 glass 对用户交互产生缩放/弹跳/微光反馈。GlassEffectContainer组合多个 glass 元素,共享采样区域,支持 fluid morphing。glassEffectID配合matchedGeometryEffect实现展开/收起的流畅过渡。
值得深挖的点
GlassEffectContainer 的必要性:glass 材质会从比自身更大的区域采样颜色来做折射,但 glass 不能采样其他 glass。如果你把多个 glass 元素放在不同容器里,视觉上会不一致。必须用 GlassEffectContainer 把它们包起来,让采样区域共享。这是很多人会踩的坑。
TabView accessory 的 placement 感知:tabViewBottomAccessoryPlacement 环境值会告诉你 accessory 当前是展开还是收在 bar 里,据此调整 UI。这种「空间感知」的设计思路值得借鉴。
Sheet 的 morph transition:Sheet 不再是「从底部弹出」那么简单,它可以从业务按钮直接 morph 展开。这需要 toolbar item 作为 navigation zoom transition 的 source、sheet content 作为 destination。效果非常流畅,但需要理解 transition 的方向性。
代码片段
// TabView 滚动收起 + 底部 accessory
TabView {
Tab("Home", systemImage: "house") { HomeView() }
Tab("Search", systemImage: "magnifyingglass", role: .search) { SearchView() }
}
.tabBarMinimizeBehavior(.onScrollDown)
.tabViewBottomAccessory {
PlaybackControls()
}
// 自定义 Glass 效果 + 交互反馈
Text("Badge")
.padding()
.glassEffect(.interactive, in: .capsule)
// Glass 容器内的 fluid morphing
@Namespace var namespace
GlassEffectContainer {
HStack {
ForEach(badges) { badge in
BadgeView(badge)
.glassEffectID(badge.id, in: namespace)
}
}
}
// 角同心性 shape
RoundedRectangle(corner: .concentricRectangle)
最佳实践
- 先删再加:如果你之前用
presentationBackground给 sheet 加了自定义背景,考虑删掉,让新的 Liquid Glass 材质自然展现。 - 清理 toolbar 后面的背景色:新设计有 automatic scroll edge effect,你之前加在 toolbar 后面的半透明遮罩或深色背景会和它冲突。
- 图标用 monochrome,但不要随便 tint:新设计下图标默认单色渲染。只有需要表达「行动号召」或「下一步」时才用
tint,不要单纯为了好看。 - 搜索框优先放在 NavigationSplitView 上:这样 iPhone 会自动把它放到底部,iPad/Mac 放到顶部 trailing 位置,一套代码适配两个平台。
- 用
concentricRectangle替代手动算圆角:它会根据容器自动匹配圆心,跨设备表现一致。
还有什么值得关注
glassEffect支持自定义 shape(不限于 capsule)和 tint,但 tint 同样只用于传达意义。- Sheets、menus、alerts、popovers 都会自动从触发它们的 Liquid Glass 控件 morph 出来,不需要额外代码。
- 如果你的 app 有密集的浮动 UI(类似 Calendar),可以用
scrollEdgeEffectStyle调整 edge effect 的锐度。 - 配合观看 “Meet Liquid Glass” 和 “Get to know the new design system” 两个 session 效果更佳。