在介绍使用新设计来开发SwiftUI app之前,我们先了解一下苹果推出的新设计
Meet Liquid Glass
Liquid Glass 是苹果在 WWDC 2025 推出的全新设计语言,它将苹果的用户界面体验提升到一个全新的层次,结合了多个历史设计元素,如 macOS Aqua、iOS 7 的实时模糊效果、iPhone X 的流畅性、灵动岛的灵活性和 visionOS 的沉浸式界面。
历史设计设计预览:
- macOS Aqua 界面设计
- iOS7的实时模糊效果

- 灵动岛的灵活性

- visionOS的沉浸式界面

Liquid Glass 样式


Liquid Glass 的特性
动态光学效果:
- Liquid Glass 使用透镜效果来传递和塑形光线,使界面元素能够动态弯曲光线,从而增加界面的层次感和深度。
- 它的行为像轻质液体,既能响应触摸流畅性,又能适应现代应用的动态变化,给用户带来直观的自然感受。
- 液态玻璃物体不会逐渐消失,而是通过逐渐调节光线的弯曲和透镜来实现和消失,确保优雅的过渡,保持材料的光学完整性。

物理与动态交互:
- Liquid Glass 在视觉和触觉交互上都非常灵敏,界面元素能够根据用户的交互进行即时反应,模拟真实世界的物理特性。
- 例如,界面元素如按钮不仅看起来透明且轻盈,当用户交互时,它们能展现出瞬时性和可塑性,仿佛"液态"流动。

响应式与自适应性:
- Liquid Glass 根据不同的环境和情境自动调整其外观,例如在明暗模式下的适配、光线变化的响应等,使得内容永远保持清晰并与背景保持适当的对比。
- 在较大的元素上,例如侧边栏,液态玻璃的外观由应用程序内的周围环境决定。

- 在滚动和动态变化的应用场景中,界面元素通过实时变化确保界面过渡流畅、无缝。
例如:当深色内容向下滚动时,玻璃本身会切换至深色样式,效果会智能切换为微妙的暗淡,再次确保对比度和易读性。

像互动时的这些效果:从内部发光,自动分离和聚拢,渐进式隐退,光线和阴影的动态变化等,都是内置的效果。
Liquid Glass 变体
Regular 变体:
适用于大多数常见场景,具备动态光学效果和适应环境的能力,在任何环境下都能提供易读性

Clear 变体:
透明度更高,适用于需要透过背景展示内容的场景,但需要调暗层以确保可读性(相当于弹框的背景)。

官方建议使用场景:
- 元素位于富媒体内容之上;
- 内容层不会受到调光层的负面影响;
- 位于其上方的内容醒目明亮
这两种变体不应混合使用。
自定义着色


使用原则
适配原则:
- 应该将 Liquid Glass 应用于界面上的浮动元素,如按钮、侧边栏等,避免在内容层中直接堆叠多个液态玻璃元素。
- 使用 Liquid Glass 时要考虑内容层的清晰性,避免在内容区过多使用这种材质,以防界面过于混乱。
请始终避免玻璃叠加。将 Liquid Glass 元素堆叠在一起会很快使界面显得杂乱无章。

总的来说,Liquid Glass 是苹果在用户界面设计方面的一次重大创新,它通过结合动态光学效果和自适应设计,提升了整个用户体验的沉浸感和流畅度。开发者可以通过这一新设计语言为应用带来更加自然、流畅和互动性的界面。它不仅在视觉上增加了深度感,还通过智能交互确保用户在操作中的每个细节都得到了优化。这标志着苹果产品设计向更加自然和直观的方向迈进。
如何将Liquid Glass引入应用程序
利用系统框架自动采用 Liquid Glass
在系统框架中,诸如条形图、表单、弹出窗口和控件等标准组件会自动采用此材质。系统框架还会根据元素重叠和焦点状态等因素动态调整这些组件。使用 SwiftUI、UIKit 和 AppKit 中的标准组件,以最少的代码充分利用此材质。
下方视频是创建了UIKit和SwiftUI的一些组件,他们自带了液态玻璃效果


如果使用系统控件,请减少在控件和导航元素中使用自定义背景。
在这些元素中使用的任何自定义背景和外观都可能与"液态玻璃"或系统提供的其他效果(例如滚动边缘效果)重叠或干扰。请务必检查NavigationSplitView
、titleBar
和toolbar(content:)
等元素中的所有自定义背景。建议移除自定义效果,并让系统决定背景外观。
在自定义视图上添加液体玻璃
应用和配置液体玻璃效果
swift
nonisolated
func glassEffect(
_ glass: Glass = .regular,
in shape: some Shape = DefaultGlassEffectShape()
) -> some View
使用glassEffect(_:in:)
修饰符为视图添加液态玻璃效果。默认情况下,修饰符使用regular
变体,并在视图内容背后的形状内应用指定的效果。
- 使用不同的形状,确保应用中的自定义组件拥有一致的外观和风格。
- 定义一种色调来表示突出性。
- 添加
interactive(_:)
到自定义组件,使其对触摸和指针交互做出反应。这将应用glass
与标准按钮相同的响应和流畅反应。

将多个视图与液体玻璃容器相结合
合并多个视图的效果
当一个界面中包含多个视图时,我们可以使用 GlassEffectContainer
容器,将它们组合在一起,以更高效地渲染 Liquid Glass 效果,同时容器还允许具有液态玻璃效果的视图将其形状混合在一起,并在过渡期间相互变形。
以下示例展示了两个图标的 Liquid Glass 背景会动态结合,当它们彼此更靠近时效果会融合:
通过调整容器的
spacing
参数,可以控制视图间的距离以及动态合并效果的触发范围。彼此靠近的视图会将其效果合并为一个形状。视图之间的距离越远,形状合并得越快。
可以看到当我调整spaceing越来越小时,他们互相融合的速度会越来越慢

创建联合效果(Union Effect)
在某些情况下,我们可能希望多个视图即便是静止不动,它们的 Liquid Glass 背景也能组合成一个统一的整体。通过 glassEffectUnion(id:namespace:)
修饰符,可以实现这种效果。

动态形状变换与动画(Morphing)
通过为视图添加 glassEffectID(_:in:)
修饰符,并结合一个 Namespace
属性包装器,可以实现 Liquid Glass 的流畅过渡动画。

可以看到,上方容器的融合间距是40,而两者之间的间距也是40,所以当橡皮擦的最近边缘小于或等于容器的间距时,他们就开始融合或者分离
利用GlassEffectContainer
实现一个展开式菜单栏
css
GlassEffectContainer(spacing: 16) {
VStack(alignment: .center, spacing: 20) {
if isExpanded {
VStack(spacing: 14) {
ForEach(icons.indices, id: .self) { index in
let icon = icons[index]
let color = colors[index]
Image(systemName: icon)
.foregroundStyle(.white)
.font(.system(size: 22))
.fontWeight(.medium)
.frame(width: 52, height: 52)
.background {
Image(systemName: "hexagon.fill")
.foregroundStyle(color)
.font(.system(size: 48))
.frame(width: 52, height: 52)
}
.padding(12)
.glassEffect(.regular, in: .rect(cornerRadius: 24))
.glassEffectID(icon, in: namespace)
}
}
}
Button {
withAnimation {
isExpanded.toggle()
}
} label: {
Label(isExpanded ? "Hide Badges" : "Show Badges",
systemImage: isExpanded ? "xmark" : "hexagon.fill")
.foregroundStyle(Color("badgeShowHideColor"))
.labelStyle(.iconOnly)
.font(.system(size: 17))
.fontWeight(.medium)
.imageScale(.large)
.frame(width: 24, height: 32)
}
.buttonStyle(.glass)
.glassEffectID("togglebutton", in: namespace)
}
.frame(width: 74)
}

避免过度使用液态玻璃效果。如果您将液态玻璃效果应用于自定义控件,请谨慎使用。液态玻璃旨在将注意力吸引到底层内容上,在多个自定义控件中过度使用此材质会分散用户对内容的注意力,从而降低用户体验。请将这些效果限制在应用中最重要的功能元素上。
好了,经过上面的介绍,我们已经大概了解了Liquid Glass的设计,特性以及如何使用,接下来,我们将从各个方向来详细的了解这次的新设计在开发中的应用
在开发中使用新设计
TabView 和 NavigationSplitView 等结构化 app 组件的更新
NavigationSplitView
侧边栏现在浮动在内容上方
他们现在有一个浮动在内容上方的液体玻璃侧边栏。

使用修饰符扩展侧边栏后面的视图.backgroundExtensionEffect()
同时,我们可以借助 backgroundExtensionEffect
修饰符,将视图内容延伸到安全区域之外,而不会裁剪其内容。

TabView
标签栏现在浮动在内容上方
在苹果新的设计系统中,iPhone 上的标签栏浮动在内容上方

控制标签栏折叠盒展开
并且可以配置tabBarMinimizeBehavior(.onScrollDown)
修饰符为在滚动时最小化,并且往相反方向滑动时自动展开。

在标签栏上方添加视图
另外,我们可以使用 tabViewBottomAccessory
修饰符将视图放置在标签栏上方。这样,当标签栏折叠时,可以利用其提供的额外空间。

Sheet
非全屏高度的表单,默认有液体玻璃背景。
在较小的高度下,底部边缘会拉入,嵌套在屏幕的弯曲边缘中。
当过渡到全高屏幕时,玻璃背景逐渐过渡,变得不透明并固定在屏幕边缘。此时点击已经没有液态玻璃的交互效果

如果您已使用 presentationBackground 修饰符将自定义背景应用到Sheet组件,请考虑将其删除,使用系统自带的背景
ToolBars
在新设计中,工具栏项目被放置在一个液态玻璃表面上,该表面漂浮在应用内容上方,并自动适应其下方的内容。

工具栏项目会自动分组
当使用 Xcode 26 构建应用时,自定义的工具栏项目会与系统提供的返回按钮分开分组
扩大项目之间的空间
我们可以使用ToolbarSpacer(.fixed)
修饰符来扩大各个项目之间的间距

用于彩色背景buttonStyle(.borderedProminent)

用于tint()
设置图标样式

搜索框的更新
使用.searchable()
修饰符即可获得搜索框

对于标签栏使用Tab(role: .search)

系统控件的液态玻璃效果
按钮
新的按钮样式.glass
和.glassProminent

滑块

step
使用参数时现在会自动显示刻度线
菜单
现在在菜单项上使用前导图标!
使用相同的标准标签或控制 API 来显示图标

对齐角半径
- 控件应与容器具有相同的角中心

- 传递给角参数或设置
.containerConcentricRectangle.rect

自定义UI融入液态玻璃效果
参考:上面的章节
本文涉及到的WWDC原视频
- Build a SwiftUI app with the new design - WWDC25 - Videos - Apple Developer
- Meet Liquid Glass - WWDC25 - Videos - Apple Developer
- Get to know the new design system - WWDC25 - Videos - Apple Developer