在 SwiftUI 中实现 Liquid Glass 设计
概述
Liquid Glass 是 iOS 中引入的一种动态材质,结合了玻璃的光学特性与流动感。它会模糊其后的内容,反射周围内容的颜色和光线,并实时响应触摸和指针交互。本指南涵盖如何在 SwiftUI 应用中实现和自定义 Liquid Glass 效果。当被请求帮助采用新的 Apple 设计时,你应该始终查找 Liquid Glass 的指南。
Liquid Glass 的关键特性:
- 模糊材质背后的内容
- 反射周围内容的颜色和光线
- 响应触摸和指针交互
- 可以在过渡期间在形状之间变形
- 可用于标准组件和自定义组件
基本实现
为视图添加 Liquid Glass
为视图添加 Liquid Glass 的最简单方式是使用glassEffect()修饰符:
Text("Hello, World!").font(.title).padding().glassEffect()默认情况下,这会在视图内容后面的 Capsule 形状内应用常规变体的 Glass。
自定义形状
你可以为 Liquid Glass 效果指定不同的形状:
Text("Hello, World!").font(.title).padding().glassEffect(in:.rect(cornerRadius:16.0))常见的形状选项:
.capsule(默认).rect(cornerRadius: CGFloat).circle
自定义 Liquid Glass 效果
Glass 变体与属性
你可以通过配置Glass结构来自定义 Liquid Glass 效果:
Text("Hello, World!").font(.title).padding().glassEffect(.regular.tint(.orange).interactive())关键自定义选项:
.regular—— 标准玻璃效果.tint(Color)—— 添加颜色色调以暗示突出性.interactive(Bool)—— 让玻璃响应触摸和指针交互
制作交互式玻璃
让 Liquid Glass 响应触摸和指针交互:
Text("Hello, World!").font(.title).padding().glassEffect(.regular.interactive(true))或者更简洁地:
Text("Hello, World!").font(.title).padding().glassEffect(.regular.interactive())处理多个玻璃效果
使用 GlassEffectContainer
当对多个视图应用 Liquid Glass 效果时,使用GlassEffectContainer以获得更好的渲染性能并启用混合和变形效果:
GlassEffectContainer(spacing:40.0){HStack(spacing:40.0){Image(systemName:"scribble.variable").frame(width:80.0,height:80.0).font(.system(size:36)).glassEffect()Image(systemName:"eraser.fill").frame(width:80.0,height:80.0).font(.system(size:36)).glassEffect()}}spacing参数控制 Liquid Glass 效果如何相互交互:
- 较小的间距:视图需要更近才能合并效果
- 较大的间距:效果在更远的距离合并
合并多个玻璃效果
要将多个视图组合成单个 Liquid Glass 效果,使用glassEffectUnion修饰符:
@Namespaceprivatevarnamespace// 稍后在视图中:GlassEffectContainer(spacing:20.0){HStack(spacing:20.0){ForEach(symbolSet.indices,id:\.self){iteminImage(systemName:symbolSet[item]).frame(width:80.0,height:80.0).font(.system(size:36)).glassEffect().glassEffectUnion(id:item<2?"1":"2",namespace:namespace)}}}这在动态创建视图或视图位于 HStack 或 VStack 之外时很有用。
变形效果与过渡
创建变形过渡
在带 Liquid Glass 的视图之间过渡时创建变形效果:
- 使用
@Namespace属性包装器创建命名空间 - 使用
glassEffectID为每个 Liquid Glass 效果关联唯一标识符 - 在改变视图层级时使用动画
@StateprivatevarisExpanded:Bool=false@Namespaceprivatevarnamespacevarbody:someView{GlassEffectContainer(spacing:40.0){HStack(spacing:40.0){Image(systemName:"scribble.variable").frame(width:80.0,height:80.0).font(.system(size:36)).glassEffect().glassEffectID("pencil",in:namespace)ifisExpanded{Image(systemName:"eraser.fill").frame(width:80.0,height:80.0).font(.system(size:36)).glassEffect().glassEffectID("eraser",in:namespace)}}}Button("Toggle"){withAnimation{isExpanded.toggle()}}.buttonStyle(.glass)}当带 Liquid Glass 的视图因视图层级变化而出现或消失时,变形效果会发生。
使用 Liquid Glass 的按钮样式
玻璃按钮样式
SwiftUI 为 Liquid Glass 提供内置的按钮样式:
Button("Click Me"){// Action}.buttonStyle(.glass)突出的玻璃按钮样式
对于更突出的玻璃按钮:
Button("Important Action"){// Action}.buttonStyle(.glassProminent)高级技术
背景扩展效果
使用背景扩展效果将内容延伸到侧边栏或检查器后面:
NavigationSplitView{// Sidebar content}detail:{// Detail content.background{// Background content that extends under the sidebar}}将水平滚动延伸到侧边栏下方
将水平滚动视图延伸到侧边栏或检查器下方:
ScrollView(.horizontal){// Scrollable content}.scrollExtensionMode(.underSidebar)最佳实践
容器使用:对多个视图应用 Liquid Glass 时,始终使用
GlassEffectContainer以获得更好的性能和变形效果。效果顺序:在影响视图外观的其他修饰符之后应用
.glassEffect()修饰符。间距考虑:仔细选择容器中的间距值,以控制玻璃效果如何以及何时合并。
动画:在改变视图层级时使用动画以启用平滑的变形过渡。
交互性:为应响应用户交互的玻璃效果添加
.interactive()。一致的设计:在应用中保持一致的形状和样式,以获得统一的观感。
示例:带 Liquid Glass 的自定义徽章
structBadgeView:View{letsymbol:Stringletcolor:Colorvarbody:someView{ZStack{Image(systemName:"hexagon.fill").foregroundColor(color).font(.system(size:50))Image(systemName:symbol).foregroundColor(.white).font(.system(size:30))}.glassEffect(.regular,in:.rect(cornerRadius:16))}}// 使用方式:GlassEffectContainer(spacing:20){HStack(spacing:20){BadgeView(symbol:"star.fill",color:.blue)BadgeView(symbol:"heart.fill",color:.red)BadgeView(symbol:"leaf.fill",color:.green)}}参考
- Applying Liquid Glass to custom views
- Landmarks: Building an app with Liquid Glass
- SwiftUI View.glassEffect(_:in:isEnabled:)
- SwiftUI GlassEffectContainer
- SwiftUI GlassEffectTransition
- SwiftUI GlassButtonStyle