iOS 26 仅需几行代码让 SwiftUI 7 液态玻璃界面焕发新春

概述

在今年的 WWDC 25 中,苹果为全平台推出了崭新的液态玻璃(Liquid Glass)皮肤。不仅如此,Apple 在此基础之上还打造了一整套超凡脱俗的动画和布局体系让 SwiftUI 7 界面焕发新机。

现在,我们只需寥寥几行代码就能将原本平淡无奇、乏善可陈的 SwiftUI 布局变成上面这般鲜活灵动。

想知道如何实现吗?看这篇就对啦!

在本篇博文中,您将学到如下内容:

  1. "一条大河窄又长"
  2. SwiftUI 7 全新玻璃特效来袭
  3. 融入,鲜活!

那还等什么呢?让我们马上迈入液态玻璃奇妙的特效世界吧? Let's go!!!;)


1. "一条大河窄又长"

在如今 App 现代化布局中,秃头小码农们非常喜爱像下面这般简洁、小巧、紧凑的全局菜单系统:

它就像一条长长的河流,伸缩自如,温柔又调皮的流入用户的心坎里。

不幸的是,目前它仿佛少了一点灵动的气息,而且感觉和 WWDC 25 中全新的液态玻璃也不太般配。

swift 复制代码
struct BadgesView: View {
    @Environment(ModelData.self) private var modelData
    @State private var isExpanded: Bool = false
    
    var body: some View {
        VStack(alignment: .center, spacing: Constants.badgeButtonTopSpacing) {
                if isExpanded {
                    VStack(spacing: Constants.badgeSpacing) {
                        ForEach(modelData.earnedBadges) {
                            BadgeLabel(badge: $0)
                        }
                    }
                }

                Button {
                    withAnimation {
                        isExpanded.toggle()
                    }
                } label: {
                    ToggleBadgesLabel(isExpanded: isExpanded)
                        .frame(width: Constants.badgeShowHideButtonWidth,
                               height: Constants.badgeShowHideButtonHeight)
                     
                }
                #if os(macOS)
                .tint(.clear)
                #endif
            }
            .frame(width: Constants.badgeFrameWidth)
    }
}

诚然,我们可以利用 SwiftUI 优秀的动画底蕴重新包装上面 BadgesView 视图的动画和转场效果,但这需要秃头小码农们宝贵的时间和头发,而且效果往往强差人意。

不过别担心,从 SwiftUI 7(iOS 26 / iPadOS 26 / macOS 26)开始,我们有了全新的选择,简单的不要不要的!

2. SwiftUI 7 全新玻璃特效来袭

从 WWDC 25 开始,全面支持 Liquid Glass 的 SwiftUI 7 推出了玻璃特效容器 GlassEffectContainer ,让我们真的可以对玻璃"为所欲为":

GlassEffectContainer 能把多个带 glassEffect(_:in:) 的视图合并成一张"可变形的联合玻璃",既省性能又能让玻璃形状彼此融合、 变形(morph)。

核心要点:

  • 用法:给子视图添加 .glassEffect(.liquid, in: container) 修改器,系统会把它们自动收集到同一个 GlassEffectContainer 中;
  • 效果:子视图的玻璃形状不再各自独立,而是当成一个整体渲染,可互相吸引、拼接、渐变和 morph;
  • 控制融合:通过容器的 spacing 值调节------值越大,子视图相距越远时就开始"粘"在一起;
  • 并发:@MainActor 隔离,线程安全。

总而言之,GlassEffectContainer 让多块"液态玻璃"合成一块可 morph 的超级玻璃,性能更高、动画更连贯。

同时,SwiftUI 7 还新增了两个配套方法 glassEffect(_:in:)glassEffectID(_:in:) :

我们可以利用它们结合 Namespace 来完成液态玻璃世界中的视图动画效果。

另外 SwiftUI 7 还专门为 Button 视图添加了 glass 按钮样式,真可谓超级"银杏化":

有了这些 SwiftUI 中的宝贝,小伙伴们可以开始来打造我们的梦幻玻璃天堂啦!

3. 融入,鲜活!

将之前的 BadgesView 视图重装升级为如下实现:

swift 复制代码
struct BadgesView: View {
    @Environment(ModelData.self) private var modelData
    @State private var isExpanded: Bool = false
    @Namespace private var namespace
    
    var body: some View {
        GlassEffectContainer(spacing: Constants.badgeGlassSpacing) {
            VStack(alignment: .center, spacing: Constants.badgeButtonTopSpacing) {
                if isExpanded {
                    VStack(spacing: Constants.badgeSpacing) {
                        ForEach(modelData.earnedBadges) {
                            BadgeLabel(badge: $0)
                                .glassEffect(.regular, in: .rect(cornerRadius: Constants.badgeCornerRadius))
                                .glassEffectID($0.id, in: namespace)
                        }
                    }
                }

                Button {
                    withAnimation {
                        isExpanded.toggle()
                    }
                } label: {
                    
                    ToggleBadgesLabel(isExpanded: isExpanded)
                        .frame(width: Constants.badgeShowHideButtonWidth,
                               height: Constants.badgeShowHideButtonHeight)
                     
                }
                .buttonStyle(.glass)
                #if os(macOS)
                .tint(.clear)
                #endif
                .glassEffectID("togglebutton", in: namespace)
            }
            .frame(width: Constants.badgeFrameWidth)
        }
    }
}

上面这段新代码把" earned 徽章列表"与底部的"展开/收起"按钮一起放进同一个 GlassEffectContainer 容器中,从而让它们全部参与 iOS 26 的「液态玻璃」合并渲染。

下面按"玻璃特性"逐句拆解:

  1. GlassEffectContainer(spacing: ...)
  • 建立一块「联合玻璃画布」。
  • spacing 决定徽章彼此、徽章与按钮之间多早开始"粘"成一体:值越大,离得越远就开始融合。
  1. 展开时才出现的 VStack + ForEach
  • 每个 BadgeLabel 同时挂两个修饰符:
    • .glassEffect(.regular, in: .rect(cornerRadius: ...))
      声明"我是 regular 风格玻璃,形状是圆角矩形"。
    • .glassEffectID(badge.id, in: namespace)
      给玻璃发身份证;同一 namespace 里身份证不同,SwiftUI 就能在增减徽章时做"液态 morph"------旧玻璃流走、新玻璃流进来,而不是生硬闪现。
  1. 底部 Button
  • .buttonStyle(.glass) 让按钮本身也是玻璃,但风格、圆角与徽章不同。
  • 同样用 .glassEffectID("togglebutton", in: namespace) 注册身份证,于是按钮的玻璃和上面徽章的玻璃被当成"同一张可变形大图"处理。
  • 展开/收起时,按钮玻璃会与刚出现(或消失)的徽章玻璃在边缘处"拉丝"融合,形成液态过渡。
  1. withAnimation { isExpanded.toggle() }
  • 状态变化被包进动画块,GlassEffectContainer 会同步驱动所有玻璃路径的 morph 动画:
    • 徽章从 0 高度"流"出来,边缘先与按钮玻璃粘连,再各自分离成独立圆角矩形。
    • 收起时反向流回,最终只剩按钮玻璃。
  1. 整体效果
    用户看到的不是"一行行控件出现",而是一块完整的「可变玻璃」:
    • 展开 → 玻璃区域向下延伸,新徽章像水泡一样从主体里分裂长出;
    • 收起 → 多余部分被"吸"回按钮,边缘圆润地收缩消失。
      全程保持同一高光、折射、模糊背景,性能也优于多图层叠加。

简单来说,上面的实现用 GlassEffectContainer 把徽章与按钮收进同一块「液态玻璃」,凭借 glassEffectIDnamespace 让它们在展开/收起时像流体一样自然融合、morph,呈现出 iOS 26 独有的"整块玻璃可生长可收缩"的视觉魔法。

要注意哦,上面动图中按钮组背后的阴影是由于 gif 图片显示局限导致的,模拟器和真机实际测试的阴影效果可是美美哒的呢!

我们把 BadgesView 视图嵌入到主视图中,宝子们再来一起欣赏一下叹为观止的液态玻璃动画效果吧:

大功告成,打完收工,棒棒哒!💯

总结

在本篇文章中,我们讨论了在 iOS 26/iPadOS 26 里如何使用 SwiftUI 7 最新的液体玻璃系统来装饰小伙伴们的 App 界面。

感谢观赏,再会吧!8-)

相关推荐
BillKu2 小时前
Vue3应用执行流程详解
前端·javascript·vue.js
Codebee3 小时前
OneCode 移动套件多平台适配详细报告
前端·人工智能
你知唔知咩系timing啊3 小时前
🎙️ 站在巨人肩膀上:基于 SenseVoice.cpp 的前端语音识别实践
前端
一位搞嵌入式的 genius3 小时前
前端开发核心技术与工具全解析:从构建工具到实时通信
前端·笔记
littleplayer3 小时前
Redux 中›ABC三个页面是如何通信的?
前端
安卓开发者3 小时前
鸿蒙NEXT的Web组件网络安全与隐私保护实践
前端·web安全·harmonyos
程序员NEO3 小时前
3分钟搞定Vue组件库
前端
程序员NEO3 小时前
WebStorm代码一键美化
前端
前端农民工ws3 小时前
Vue 框架的 markdown 渲染组件,针对 AI 的 markdown 流式传输场景
前端·javascript·vue.js·ai