Guía de implementación SwiftUI · UIKit · WidgetKit
Sección 01 — Dashboard
// 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) ) } }
// 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)
// 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
Sección 02 — Componentes
Biblioteca de componentes Glass
Todos los estilos de botón y surface disponibles en iOS 26 Liquid Glass.
spacing controla la fusiónSección 03 — Design Tokens
Tokens de implementación para FitTrack Pro
Referencia rápida de valores, modificadores y uso recomendado por componente.
Sección 04 — WidgetKit
Widgets con Liquid Glass + Accented Mode
Los widgets de iOS 26 deben soportar .accented rendering mode para el tono del Homescreen.
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) } } } }
Sección 05 — Anti-patrones
Errores comunes al migrar a Liquid Glass
.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
}
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()
}
}
.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
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