[WWDC 2025] 用新设计构建一个SwiftUI应用程序

在介绍使用新设计来开发SwiftUI app之前,我们先了解一下苹果推出的新设计

Meet Liquid Glass

Liquid Glass 是苹果在 WWDC 2025 推出的全新设计语言,它将苹果的用户界面体验提升到一个全新的层次,结合了多个历史设计元素,如 macOS Aqua、iOS 7 的实时模糊效果、iPhone X 的流畅性、灵动岛的灵活性和 visionOS 的沉浸式界面。

历史设计设计预览:

  1. macOS Aqua 界面设计

  1. iOS7的实时模糊效果
  1. 灵动岛的灵活性
  1. visionOS的沉浸式界面

Liquid Glass 样式

Liquid Glass 的特性

动态光学效果

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

物理与动态交互

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

响应式与自适应性

  • Liquid Glass 根据不同的环境和情境自动调整其外观,例如在明暗模式下的适配、光线变化的响应等,使得内容永远保持清晰并与背景保持适当的对比。
  • 在较大的元素上,例如侧边栏,液态玻璃的外观由应用程序内的周围环境决定。
  • 在滚动和动态变化的应用场景中,界面元素通过实时变化确保界面过渡流畅、无缝。

例如:当深色内容向下滚动时,玻璃本身会切换至深色样式,效果会智能切换为微妙的暗淡,再次确保对比度和易读性。

像互动时的这些效果:从内部发光,自动分离和聚拢,渐进式隐退,光线和阴影的动态变化等,都是内置的效果。

Liquid Glass 变体

Regular 变体

适用于大多数常见场景,具备动态光学效果和适应环境的能力,在任何环境下都能提供易读性

Clear 变体

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

官方建议使用场景:

  1. 元素位于富媒体内容之上;
  2. 内容层不会受到调光层的负面影响;
  3. 位于其上方的内容醒目明亮

这两种变体不应混合使用。

自定义着色

使用原则

适配原则

  • 应该将 Liquid Glass 应用于界面上的浮动元素,如按钮、侧边栏等,避免在内容层中直接堆叠多个液态玻璃元素。
  • 使用 Liquid Glass 时要考虑内容层的清晰性,避免在内容区过多使用这种材质,以防界面过于混乱。

请始终避免玻璃叠加。将 Liquid Glass 元素堆叠在一起会很快使界面显得杂乱无章。

总的来说,Liquid Glass 是苹果在用户界面设计方面的一次重大创新,它通过结合动态光学效果和自适应设计,提升了整个用户体验的沉浸感和流畅度。开发者可以通过这一新设计语言为应用带来更加自然、流畅和互动性的界面。它不仅在视觉上增加了深度感,还通过智能交互确保用户在操作中的每个细节都得到了优化。这标志着苹果产品设计向更加自然和直观的方向迈进。

如何将Liquid Glass引入应用程序

利用系统框架自动采用 Liquid Glass

在系统框架中,诸如条形图、表单、弹出窗口和控件等标准组件会自动采用此材质。系统框架还会根据元素重叠和焦点状态等因素动态调整这些组件。使用 SwiftUI、UIKit 和 AppKit 中的标准组件,以最少的代码充分利用此材质。

下方视频是创建了UIKit和SwiftUI的一些组件,他们自带了液态玻璃效果

如果使用系统控件,请减少在控件和导航元素中使用自定义背景。

在这些元素中使用的任何自定义背景和外观都可能与"液态玻璃"或系统提供的其他效果(例如滚动边缘效果)重叠或干扰。请务必检查NavigationSplitViewtitleBartoolbar(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的设计,特性以及如何使用,接下来,我们将从各个方向来详细的了解这次的新设计在开发中的应用

在开发中使用新设计

侧边栏现在浮动在内容上方

他们现在有一个浮动在内容上方的液体玻璃侧边栏。

使用修饰符扩展侧边栏后面的视图.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原视频

  1. Build a SwiftUI app with the new design - WWDC25 - Videos - Apple Developer
  2. Meet Liquid Glass - WWDC25 - Videos - Apple Developer
  3. Get to know the new design system - WWDC25 - Videos - Apple Developer

参考文档

  1. Adopting Liquid Glass | Apple Developer Documentation
  2. Landmarks: Building an app with Liquid Glass | Apple Developer Documentation
  3. Applying Liquid Glass to custom views | Apple Developer Documentation
相关推荐
大熊猫侯佩1 天前
无需自己写半行代码:让 AI 编程智能体(Agent)化身神笔马良为我们自动仿制 App 界面
swiftui·agent·cursor
杂雾无尘2 天前
SwiftUI 动画新技能,让你的应用「活」起来!
ios·swiftui·swift
东坡肘子2 天前
Blender 正在开发 iPad 版本 | 肘子的 Swift 周报 #095
swiftui·swift·apple
东坡肘子9 天前
F1:电影很好看,赛事很挣钱 | 肘子的 Swift 周报 #094
swiftui·swift·apple
zhangmeng13 天前
SwiftUI中如何实现子视图向父视图传递数据?
ios·swiftui·swift
大熊猫侯佩14 天前
探秘 WWDC 25 全新 #Playground 宏:提升 Swift 开发效率的超级神器
xcode·swift·wwdc
瓜子三百克15 天前
SwiftUI 全面介绍与使用指南
ios·swiftui·swift
SoaringHeart16 天前
SwiftUI研究:原生路由导航重构封装研究
前端·swiftui·swift
东坡肘子16 天前
变暗的 Liquid Glass 和消失的 Apple Intelligence | 肘子的 Swift 周报 #093
swiftui·swift·apple