Loading...
Loading...
Implement, review, or improve SwiftUI Liquid Glass effects for iOS 26+. Covers glassEffect modifier, GlassEffectContainer, glass button styles, glass toolbar, glass tab bar, morphing transitions, translucent material, vibrancy, tinting, interactive glass, ToolbarSpacer, scrollEdgeEffectStyle, backgroundExtensionEffect, and availability gating. Use when asked about Liquid Glass, glass buttons, glassEffect, GlassEffectContainer, GlassEffectTransition, glassEffectID, glassEffectUnion, scroll edge effects, or adopting iOS 26 design.
npx skill4agent add dpearson2699/swift-ios-skills swiftui-liquid-glassreferences/liquid-glass.mdGlassEffectContainer.glassEffect().interactive()glassEffectID(_:in:)if #available(iOS 26, *).glassEffect()GlassEffectContainer.buttonStyle(.glass).buttonStyle(.glassProminent).regularCapsulefunc glassEffect(
_ glass: Glass = .regular,
in shape: some Shape = DefaultGlassEffectShape()
) -> some View| Property / Method | Purpose |
|---|---|
| Standard glass material |
| Clear variant (minimal tint) |
| No visual effect (pass-through) |
| Add a color tint for prominence |
| React to touch and pointer interactions |
.regular.tint(.blue).interactive()GlassEffectContainer(spacing: 24) {
// child views with .glassEffect()
}spacing| Modifier | Purpose |
|---|---|
| Stable identity for morphing during view hierarchy changes |
| Merge multiple views into one glass shape |
| Control how glass appears/disappears |
.matchedGeometry.materialize.identityButton("Action") { }
.buttonStyle(.glass) // standard glass button
Button("Primary") { }
.buttonStyle(.glassProminent) // prominent glass buttonScrollView {
content
}
.scrollEdgeEffectStyle(.soft, for: .top) // Fading edge effect at scroll boundaries
// Mirror and blur content at safe area edges (behind glass toolbars)
content
.backgroundExtensionEffect().toolbar {
ToolbarItem { Button("Edit") { } }
ToolbarItem { ToolbarSpacer() }
ToolbarItem { Button("Share") { } }
}if #available(iOS 26, *) {
Text("Status")
.padding()
.glassEffect(.regular.interactive(), in: .rect(cornerRadius: 16))
} else {
Text("Status")
.padding()
.background(.ultraThinMaterial, in: RoundedRectangle(cornerRadius: 16))
}GlassEffectContainer(spacing: 24) {
HStack(spacing: 24) {
ForEach(tools) { tool in
Image(systemName: tool.icon)
.frame(width: 56, height: 56)
.glassEffect(.regular.interactive())
}
}
}@State private var isExpanded = false
@Namespace private var ns
var body: some View {
GlassEffectContainer(spacing: 40) {
HStack(spacing: 40) {
Image(systemName: "pencil")
.frame(width: 80, height: 80)
.glassEffect()
.glassEffectID("pencil", in: ns)
if isExpanded {
Image(systemName: "eraser.fill")
.frame(width: 80, height: 80)
.glassEffect()
.glassEffectID("eraser", in: ns)
}
}
}
Button("Toggle") {
withAnimation { isExpanded.toggle() }
}
.buttonStyle(.glass)
}@Namespace private var ns
GlassEffectContainer(spacing: 20) {
HStack(spacing: 20) {
ForEach(items.indices, id: \.self) { i in
Image(systemName: items[i])
.frame(width: 80, height: 80)
.glassEffect()
.glassEffectUnion(id: i < 2 ? "group1" : "group2", namespace: ns)
}
}
}struct GlassBadge: View {
let icon: String
let tint: Color
var body: some View {
Image(systemName: icon)
.font(.title2)
.padding()
.glassEffect(.regular.tint(tint), in: .rect(cornerRadius: 12))
}
}GlassEffectContainer.glassEffect().interactive()GlassEffectContainer.buttonStyle(.glass).buttonStyle(.glassProminent)if #available(iOS 26, *)withAnimationglassEffectIDGlassEffectContainerGlassEffectContainer.interactive().glassEffect()if #available(iOS 26, *)GlassEffectContainer.glassEffect().interactive()glassEffectID@Namespace.matchedGeometry.materialize.glass.glassProminentfetchAppleDocumentation/documentation/SwiftUI/View/glassEffect(_:in:)references/liquid-glass.md