liquid-glass-design
affaan-m/ECC
Implementieren Sie Apples „Liquid Glass“-Designsystem für iOS 26+ mit dynamischen Glasmaterialien, Unschärfeeffekten, Reflexionen und interaktiven Übergängen in SwiftUI, UIKit und WidgetKit.
...Alle erweiternLiquid Glass Design System (iOS 26)
Muster zur Implementierung von Apples Liquid Glass – einem dynamischen Material, das Inhalte im Hintergrund verschwimmen lässt, Farben und Licht aus der Umgebung reflektiert und auf Berührungen sowie Zeigerinteraktionen reagiert. Behandelt die Integration in SwiftUI, UIKit und WidgetKit.
Wann aktivieren?
- Beim Erstellen oder Aktualisieren von Apps für iOS 26+ mit der neuen Designsprache
- Implementierung von Schaltflächen, Karten, Symbolleisten oder Containern im Glas-Stil
- Erstellen von Morphing-Übergängen zwischen Glaselementen
- Anwenden von Liquid-Glass-Effekten auf Widgets
- Migration bestehender Unschärfe-/Material-Effekte zur neuen Liquid-Glass-API
Kernmuster – SwiftUI
Grundlegender Glaseffekt
Der einfachste Weg, Liquid Glass zu einer beliebigen Ansicht hinzuzufügen:
Text("Hello, World!")
.font(.title)
.padding()
.glassEffect() // Standard: reguläre Variante, Kapselform
Form und Farbton anpassen
Text("Hello, World!")
.font(.title)
.padding()
.glassEffect(.regular.tint(.orange).interactive(), in: .rect(cornerRadius: 16.0))
Wichtige Anpassungsoptionen:
.regular— Standard-Glas-Effekt.tint(Farbe)– Farbtönung hinzufügen, um den Text hervorzuheben.interactive()– auf Berührungen und Mausinteraktionen reagieren- Form:
.capsule(Standard),.rect(cornerRadius:),.circle
Glas-Button-Stile
Button("Click Me") { /* Aktion */ }
.buttonStyle(.glass)
Button("Important") { /* Aktion */ }
.buttonStyle(.glassProminent)
GlassEffectContainer für mehrere Elemente
Schließen Sie mehrere Glasansichten aus Gründen der Leistung und für Morphing-Effekte immer in einen Container ein:
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()
}
}
Der Parameter „spacing“ steuert den Überblendungsabstand – Elemente, die näher beieinander liegen, verschmelzen ihre Glasformen miteinander.
Glas-Effekte vereinen
Kombinieren Sie mehrere Ansichten mit ` glassEffectUnion` zu einer einzigen Glasform:
@Namespace private var namespace
GlassEffectContainer(spacing: 20.0) {
HStack(spacing: 20.0) {
ForEach(symbolSet.indices, id: \.self) { item in
Image(systemName: symbolSet[item])
.frame(width: 80.0, height: 80.0)
.glassEffect()
.glassEffectUnion(id: item < 2 ? "group1" : "group2", namespace: namespace)
}
}
}
Morphing-Übergänge
Erstellen Sie fließende Übergänge, wenn Glaselemente erscheinen oder verschwinden:
@State private var isExpanded = false
@Namespace private var namespace
GlassEffectContainer(spacing: 40.0) {
HStack(spacing: 40.0) {
Image(systemName: "scribble.variable")
.frame(width: 80.0, height: 80.0)
.glassEffect()
.glassEffectID("pencil", in: namespace)
if isExpanded {
Image(systemName: "eraser.fill")
.frame(width: 80.0, height: 80.0)
.glassEffect()
.glassEffectID("eraser", in: namespace)
}
}
}
Button("Toggle") {
withAnimation { isExpanded.toggle() }
}
.buttonStyle(.glass)
Horizontales Scrollen unterhalb der Seitenleiste erweitern
Damit sich horizontal scrollbare Inhalte unter eine Seitenleiste oder einen Inspektor erstrecken können, muss sichergestellt werden, dass der Inhalt des `ScrollView` die vorderen und hinteren Ränder des Containers erreicht. Das System regelt das Scrollverhalten unterhalb der Seitenleiste automatisch, wenn sich das Layout bis zu den Rändern erstreckt – es ist kein zusätzlicher Modifikator erforderlich.
Kernmuster – UIKit
Grundlegender UIGlassEffect
let glassEffect = UIGlassEffect()
glassEffect.tintColor = UIColor.systemBlue.withAlphaComponent(0.3)
glassEffect.isInteractive = true
let visualEffectView = UIVisualEffectView(effect: glassEffect)
visualEffectView.translatesAutoresizingMaskIntoConstraints = false
visualEffectView.layer.cornerRadius = 20
visualEffectView.clipsToBounds = true
view.addSubview(visualEffectView)
NSLayoutConstraint.activate([
visualEffectView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
visualEffectView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
visualEffectView.widthAnchor.constraint(equalToConstant: 200),
visualEffectView.heightAnchor.constraint(equalToConstant: 120)
])
// Inhalt zu `contentView` hinzufügen
let label = UILabel()
label.text = "Liquid Glass"
label.translatesAutoresizingMaskIntoConstraints = false
visualEffectView.contentView.addSubview(label)
NSLayoutConstraint.activate([
label.centerXAnchor.constraint(equalTo: visualEffectView.contentView.centerXAnchor),
label.centerYAnchor.constraint(equalTo: visualEffectView.contentView.centerYAnchor)
])
UIGlassContainerEffect für mehrere Elemente
let containerEffect = UIGlassContainerEffect()
containerEffect.spacing = 40.0
let containerView = UIVisualEffectView(effect: containerEffect)
let firstGlass = UIVisualEffectView(effect: UIGlassEffect())
let secondGlass = UIVisualEffectView(effect: UIGlassEffect())
containerView.contentView.addSubview(firstGlass)
containerView.contentView.addSubview(secondGlass)
Scroll-Rand-Effekte
scrollView.topEdgeEffect.style = .automatic
scrollView.bottomEdgeEffect.style = .hard
scrollView.leftEdgeEffect.isHidden = true
Integration von Glas-Effekten in die Toolbar
let favoriteButton = UIBarButtonItem(image: UIImage(systemName: "heart"), style: .plain, target: self, action: #selector(favoriteAction))
favoriteButton.hidesSharedBackground = true // Gemeinsamen Glass-Hintergrund deaktivieren
Kernmuster – WidgetKit
Erkennung des Rendering-Modus
struct MyWidgetView: View {
@Environment(\.widgetRenderingMode) var renderingMode
var body: some View {
if renderingMode == .accented {
// Getönter Modus: weiß getönter, themenbezogener Glashintergrund
} else {
// Vollfarbmodus: Standarddarstellung
}
}
}
Akzentgruppen für die visuelle Hierarchie
HStack {
VStack(alignment: .leading) {
Text("Titel")
.widgetAccentable() // Akzentgruppe
Text("Untertitel")
// Primäre Gruppe (Standard)
}
Image(systemName: "star.fill")
.widgetAccentable() // Akzentgruppe
}
Bilddarstellung im Akzentmodus
Image("myImage")
.widgetAccentedRenderingMode(.monochrome)
Container-Hintergrund
VStack { /* Inhalt */ }
.containerBackground(for: .widget) {
Color.blue.opacity(0.2)
}
Wichtige Designentscheidungen
| Entscheidung | Begründung |
|---|---|
| GlassEffectContainer-Umschlag | Leistungsoptimierung, ermöglicht das Überblenden zwischen Glaselementen |
Abstandsparameter |
Steuert den Überblendungsabstand – ermöglicht die Feinabstimmung, wie nah Elemente beieinander liegen müssen, um ineinander zu übergehen |
@Namespace + glassEffectID |
Ermöglicht flüssige Übergänge bei Änderungen der Ansichtshierarchie |
Modifikator„interactive() “ |
Explizite Aktivierung von Reaktionen auf Berührungen/Zeigerbewegungen – nicht alle Glaselemente sollten reagieren |
| UIGlassContainerEffect in UIKit | Aus Gründen der Konsistenz dasselbe Container-Muster wie in SwiftUI |
| Modus für akzentuierte Darstellung in Widgets | Das System wendet getöntes Glas an, wenn der Benutzer einen getönten Startbildschirm auswählt |
Bewährte Vorgehensweisen
- Verwenden Sie immer `GlassEffectContainer`, wenn Sie Glas auf mehrere gleichrangige Ansichten anwenden – dies ermöglicht Morphing und verbessert die Darstellungsleistung
- Wenden Sie
.glassEffect()nach anderen Darstellungsmodifikatoren (Rahmen, Schriftart, Abstand)an - Verwenden Sie
.interactive()nur bei Elementen, die auf Benutzerinteraktionen reagieren (Schaltflächen, umschaltbare Elemente) - Wählen Sie die Abstände in Containernsorgfältig aus, um zu steuern, wann Glaseffekte ineinander übergehen
- Verwenden Sie
„withAnimation“, wenn Sie die View-Hierarchien ändern, um flüssige Morphing-Übergänge zu ermöglichen - Testen Sie die Darstellung in allen Modi – Hellmodus, Dunkelmodus sowie akzentuierte/getönte Modi
- Stellen Sie den Kontrast für Barrierefreiheit sicher – Text auf Glas muss lesbar bleiben
Zu vermeidende Anti-Muster
- Verwendung mehrerer eigenständiger
.glassEffect()-Ansichten ohne einen „GlassEffectContainer“ - Zu viele Glas-Effekte verschachteln – beeinträchtigt die Leistung und die visuelle Übersichtlichkeit
- Anwendung von Glaseffekten auf jede Ansicht – diese sollten interaktiven Elementen, Symbolleisten und Karten vorbehalten bleiben
- Vergessen von `
clipsToBounds = true` in UIKit bei der Verwendung von Eckenradien - Den Modus „Accented“ in Widgets ignorieren – beeinträchtigt das getönte Erscheinungsbild des Startbildschirms
- Die Verwendung undurchsichtiger Hintergründe hinter Glas – macht den Transluzenzeffekt zunichte
Wann zu verwenden
- Navigationsleisten, Symbolleisten und Registerkartenleisten mit dem neuen iOS 26-Design
- Schwebende Aktionsschaltflächen und Container im Kartenstil
- Interaktive Steuerelemente, die visuelle Tiefe und Touch-Feedback erfordern
- Widgets, die sich in das „Liquid Glass“-Design des Systems einfügen sollen
- Morphing-Übergänge zwischen verwandten UI-Zuständen
---
name: liquid-glass-design
description: Implement Apple's Liquid Glass design system for iOS 26+ with dynamic glass materials, blur, reflection, and interactive morphing in SwiftUI, UIKit, and WidgetKit.
---
# Liquid Glass Design System (iOS 26)
Patterns for implementing Apple's Liquid Glass — a dynamic material that blurs content behind it, reflects color and light from surrounding content, and reacts to touch and pointer interactions. Covers SwiftUI, UIKit, and WidgetKit integration.
## When to Activate
- Building or updating apps for iOS 26+ with the new design language
- Implementing glass-style buttons, cards, toolbars, or containers
- Creating morphing transitions between glass elements
- Applying Liquid Glass effects to widgets
- Migrating existing blur/material effects to the new Liquid Glass API
## Core Pattern — SwiftUI
### Basic Glass Effect
The simplest way to add Liquid Glass to any view:
```swift
Text("Hello, World!")
.font(.title)
.padding()
.glassEffect() // Default: regular variant, capsule shape
```
### Customizing Shape and Tint
```swift
Text("Hello, World!")
.font(.title)
.padding()
.glassEffect(.regular.tint(.orange).interactive(), in: .rect(cornerRadius: 16.0))
```
Key customization options:
- `.regular` — standard glass effect
- `.tint(Color)` — add color tint for prominence
- `.interactive()` — react to touch and pointer interactions
- Shape: `.capsule` (default), `.rect(cornerRadius:)`, `.circle`
### Glass Button Styles
```swift
Button("Click Me") { /* action */ }
.buttonStyle(.glass)
Button("Important") { /* action */ }
.buttonStyle(.glassProminent)
```
### GlassEffectContainer for Multiple Elements
Always wrap multiple glass views in a container for performance and morphing:
```swift
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()
}
}
```
The `spacing` parameter controls merge distance — closer elements blend their glass shapes together.
### Uniting Glass Effects
Combine multiple views into a single glass shape with `glassEffectUnion`:
```swift
@Namespace private var namespace
GlassEffectContainer(spacing: 20.0) {
HStack(spacing: 20.0) {
ForEach(symbolSet.indices, id: \.self) { item in
Image(systemName: symbolSet[item])
.frame(width: 80.0, height: 80.0)
.glassEffect()
.glassEffectUnion(id: item < 2 ? "group1" : "group2", namespace: namespace)
}
}
}
```
### Morphing Transitions
Create smooth morphing when glass elements appear/disappear:
```swift
@State private var isExpanded = false
@Namespace private var namespace
GlassEffectContainer(spacing: 40.0) {
HStack(spacing: 40.0) {
Image(systemName: "scribble.variable")
.frame(width: 80.0, height: 80.0)
.glassEffect()
.glassEffectID("pencil", in: namespace)
if isExpanded {
Image(systemName: "eraser.fill")
.frame(width: 80.0, height: 80.0)
.glassEffect()
.glassEffectID("eraser", in: namespace)
}
}
}
Button("Toggle") {
withAnimation { isExpanded.toggle() }
}
.buttonStyle(.glass)
```
### Extending Horizontal Scrolling Under Sidebar
To allow horizontal scroll content to extend under a sidebar or inspector, ensure the `ScrollView` content reaches the leading/trailing edges of the container. The system automatically handles the under-sidebar scrolling behavior when the layout extends to the edges — no additional modifier is needed.
## Core Pattern — UIKit
### Basic UIGlassEffect
```swift
let glassEffect = UIGlassEffect()
glassEffect.tintColor = UIColor.systemBlue.withAlphaComponent(0.3)
glassEffect.isInteractive = true
let visualEffectView = UIVisualEffectView(effect: glassEffect)
visualEffectView.translatesAutoresizingMaskIntoConstraints = false
visualEffectView.layer.cornerRadius = 20
visualEffectView.clipsToBounds = true
view.addSubview(visualEffectView)
NSLayoutConstraint.activate([
visualEffectView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
visualEffectView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
visualEffectView.widthAnchor.constraint(equalToConstant: 200),
visualEffectView.heightAnchor.constraint(equalToConstant: 120)
])
// Add content to contentView
let label = UILabel()
label.text = "Liquid Glass"
label.translatesAutoresizingMaskIntoConstraints = false
visualEffectView.contentView.addSubview(label)
NSLayoutConstraint.activate([
label.centerXAnchor.constraint(equalTo: visualEffectView.contentView.centerXAnchor),
label.centerYAnchor.constraint(equalTo: visualEffectView.contentView.centerYAnchor)
])
```
### UIGlassContainerEffect for Multiple Elements
```swift
let containerEffect = UIGlassContainerEffect()
containerEffect.spacing = 40.0
let containerView = UIVisualEffectView(effect: containerEffect)
let firstGlass = UIVisualEffectView(effect: UIGlassEffect())
let secondGlass = UIVisualEffectView(effect: UIGlassEffect())
containerView.contentView.addSubview(firstGlass)
containerView.contentView.addSubview(secondGlass)
```
### Scroll Edge Effects
```swift
scrollView.topEdgeEffect.style = .automatic
scrollView.bottomEdgeEffect.style = .hard
scrollView.leftEdgeEffect.isHidden = true
```
### Toolbar Glass Integration
```swift
let favoriteButton = UIBarButtonItem(image: UIImage(systemName: "heart"), style: .plain, target: self, action: #selector(favoriteAction))
favoriteButton.hidesSharedBackground = true // Opt out of shared glass background
```
## Core Pattern — WidgetKit
### Rendering Mode Detection
```swift
struct MyWidgetView: View {
@Environment(\.widgetRenderingMode) var renderingMode
var body: some View {
if renderingMode == .accented {
// Tinted mode: white-tinted, themed glass background
} else {
// Full color mode: standard appearance
}
}
}
```
### Accent Groups for Visual Hierarchy
```swift
HStack {
VStack(alignment: .leading) {
Text("Title")
.widgetAccentable() // Accent group
Text("Subtitle")
// Primary group (default)
}
Image(systemName: "star.fill")
.widgetAccentable() // Accent group
}
```
### Image Rendering in Accented Mode
```swift
Image("myImage")
.widgetAccentedRenderingMode(.monochrome)
```
### Container Background
```swift
VStack { /* content */ }
.containerBackground(for: .widget) {
Color.blue.opacity(0.2)
}
```
## Key Design Decisions
| Decision | Rationale |
|----------|-----------|
| GlassEffectContainer wrapping | Performance optimization, enables morphing between glass elements |
| `spacing` parameter | Controls merge distance — fine-tune how close elements must be to blend |
| `@Namespace` + `glassEffectID` | Enables smooth morphing transitions on view hierarchy changes |
| `interactive()` modifier | Explicit opt-in for touch/pointer reactions — not all glass should respond |
| UIGlassContainerEffect in UIKit | Same container pattern as SwiftUI for consistency |
| Accented rendering mode in widgets | System applies tinted glass when user selects tinted Home Screen |
## Best Practices
- **Always use GlassEffectContainer** when applying glass to multiple sibling views — it enables morphing and improves rendering performance
- **Apply `.glassEffect()` after** other appearance modifiers (frame, font, padding)
- **Use `.interactive()`** only on elements that respond to user interaction (buttons, toggleable items)
- **Choose spacing carefully** in containers to control when glass effects merge
- **Use `withAnimation`** when changing view hierarchies to enable smooth morphing transitions
- **Test across appearances** — light mode, dark mode, and accented/tinted modes
- **Ensure accessibility contrast** — text on glass must remain readable
## Anti-Patterns to Avoid
- Using multiple standalone `.glassEffect()` views without a GlassEffectContainer
- Nesting too many glass effects — degrades performance and visual clarity
- Applying glass to every view — reserve for interactive elements, toolbars, and cards
- Forgetting `clipsToBounds = true` in UIKit when using corner radii
- Ignoring accented rendering mode in widgets — breaks tinted Home Screen appearance
- Using opaque backgrounds behind glass — defeats the translucency effect
## When to Use
- Navigation bars, toolbars, and tab bars with the new iOS 26 design
- Floating action buttons and card-style containers
- Interactive controls that need visual depth and touch feedback
- Widgets that should integrate with the system's Liquid Glass appearance
- Morphing transitions between related UI states
Alle Dateien
1 Dateienliquid-glass-design installieren
Laden Sie die Skill-Dateien herunter und entpacken Sie sie in Ihr Verzeichnis „.claude/skills/“.
ZIP herunterladenKlonen Sie das Repository und kopieren Sie die Skill-Dateien in Ihr Projekt.
git clone https://github.com/affaan-m/ECC/tree/main/skills/liquid-glass-design # Copy SKILL.md to your .claude/skills/ directory
Kopieren





Heim
