iOS 26 · WWDC 2026 · FitTrack Pro

Liquid Glass
Design System

Guía de implementación SwiftUI · UIKit · WidgetKit

9:41
Hola, Carlos 👋
Miércoles, 18 junio · Meta diaria al 74%
🏃
8.240 pas
Pasos hoy
🔥
1.847 kcal
Calorías
💧
1,8 L
Hidratación
❤️
72 bpm
Frecuencia
Anillos activos
74% completado
Movimiento · Ejercicio · Pie
Próxima actividad
Carrera 5K — 18:30
Parque del Retiro · En 2h 12m
🏅
🏠
Inicio
📊
Stats
🗓️
Plan
👤
Perfil
DashboardView.swift
// Metric card con Liquid Glass + tint
struct MetricCard: View {
    let icon: String
    let value: String
    let label: String
    let tintColor: Color

    var body: some View {
        VStack(alignment: .leading, spacing: 8) {
            Image(systemName: icon)
                .font(.title2)
            Text(value)
                .font(.title.bold())
            Text(label)
                .font(.caption)
                .opacity(0.6)
        }
        .frame(maxWidth: .infinity, alignment: .leading)
        .padding(16)
        .glassEffect( // ← Liquid Glass API
            .regular
                .tint(tintColor)
                .interactive(),
            in: .rect(cornerRadius: 18)
        )
    }
}
TabBar + FAB.swift
// Tab bar automáticamente glass en iOS 26
TabView(selection: $selectedTab) {
    DashboardView()
        .tabItem {
            Label("Inicio", systemImage: "house.fill")
        }
        .tag(0)
    // ... more tabs
}

// FAB con buttonStyle(.glassProminent)
Button(action: { showLogger = true }) {
    Image(systemName: "plus")
        .font(.title2.weight(.semibold))
        .frame(width: 52, height: 52)
}
.buttonStyle(.glassProminent)
.tint(.green)
GlassContainer.swift
// Múltiples glass → SIEMPRE en container
GlassEffectContainer(spacing: 16.0) {
    HStack(spacing: 16.0) {
        ForEach(metrics) { metric in
            MetricCard(
                icon: metric.icon,
                value: metric.formatted,
                label: metric.label,
                tintColor: metric.color
            )
        }
    }
}
// spacing=16 → glass cards se mantienen
// separadas sin fusionarse

Biblioteca de componentes Glass

Todos los estilos de botón y surface disponibles en iOS 26 Liquid Glass.

buttonStyle
.glass
buttonStyle
.glassProminent
glassEffect
.tint(.blue)
glassEffect
.tint(.orange)
Cómo el parámetro spacing controla la fusión
🏃
💧
spacing: 60 → Elementos separados
🏃
💧
spacing: 8 → Glass se fusiona
🏃 8.240 pasos
💧 1.8L agua
🔥 1.847 kcal
spacing: 2 → Card unificada

Tokens de implementación para FitTrack Pro

Referencia rápida de valores, modificadores y uso recomendado por componente.

Componente Modificador SwiftUI Color / Tint cornerRadius interactive Contexto
Metric Card — Pasos .glassEffect(.regular.tint(.green).interactive())
#34C759
18 Dashboard grid
Metric Card — Calorías .glassEffect(.regular.tint(.orange).interactive())
#FF9500
18 Dashboard grid
Metric Card — Agua .glassEffect(.regular.tint(.blue).interactive())
#007AFF
18 Dashboard grid
FAB — Registrar .buttonStyle(.glassProminent).tint(.green)
#34C759
capsule Floating sobre scroll
Toolbar buttons .buttonStyle(.glass)
System
capsule NavigationBar
Tab bar Automático iOS 26
System
Auto TabView nativo
Activity Ring card .glassEffect()
Sin tint
22 No Card informativa
Widget homescreen .containerBackground(for: .widget)
Accented
22 N/A WidgetKit Small
GlassEffectContainer GlassEffectContainer(spacing: 16) Wrapper Toda la grid metrics

Widgets con Liquid Glass + Accented Mode

Los widgets de iOS 26 deben soportar .accented rendering mode para el tono del Homescreen.

🏃
8.240
pasos hoy
Meta: 10.000
82%
💧
1,8L
hidratación
Meta: 2,5L
72%
Resumen FitTrack
Carlos, vas
muy bien hoy 💪
8.2k
pasos
1.8k
kcal
1.8L
agua
74%
FitTrackWidget.swift
struct FitTrackWidgetView: View {
    @Environment(\.widgetRenderingMode)
    var renderingMode

    var body: some View {
        VStack(alignment: .leading) {
            Text("Pasos")
                .widgetAccentable() // ← accent group
            Text("\(entry.steps)")
                .font(.title.bold())
        }
        .containerBackground(for: .widget) {
            if renderingMode == .accented {
                Color.white.opacity(0.08)
            } else {
                Color.green.opacity(0.12)
            }
        }
    }
}

Errores comunes al migrar a Liquid Glass

✗ Incorrecto
Múltiples glass sin container
Aplicar .glassEffect() a varias views sin envolver en GlassEffectContainer. Degrada el rendimiento y rompe las transiciones de morphing entre elementos.
// ❌ MAL
HStack {
View1().glassEffect()
View2().glassEffect() // render 2x
}
✓ Correcto
Siempre GlassEffectContainer
Envolver múltiples vistas glass en GlassEffectContainer. Renderizado en un solo pase, habilita morphing y garantiza que spacing controle la fusión visual.
// ✅ BIEN
GlassEffectContainer(spacing: 16) {
HStack {
View1().glassEffect()
View2().glassEffect()
}
}
✗ Incorrecto
Fondo opaco bajo glass
Usar .background(Color.white) detrás de un glass element anula el efecto de translucencia. El blur no tiene contenido dinámico que reflejar.
// ❌ MAL
.background(.white) // opaco
.glassEffect() // inútil
✓ Correcto
UIKit: clipsToBounds obligatorio
En UIKit, siempre activar clipsToBounds = true junto al cornerRadius. Sin él, el efecto glass se desborda fuera de los límites del view.
// ✅ BIEN (UIKit)
glassView.layer.cornerRadius = 20
glassView.clipsToBounds = true ← clave