wandres.dev
SWIFTUI ESENCIAL · vistas y estado

Modificadores y composición de vistas

Los modificadores dan estilo y comportamiento a las vistas. El orden importa, se encadenan, y extraer subvistas mantiene tu código limpio.

⏱ 13 min

Un modificador transforma una vista y devuelve otra vista. Encadenándolos construyes apariencia y comportamiento capa a capa. Es simple, pero hay un detalle que confunde a todos al principio: el orden cambia el resultado.

🎯 Al terminar esta lección sabrás
  • Qué es un modificador y cómo se encadena.
  • Por qué el orden importa.
  • Modificadores comunes de estilo y espaciado.
  • Extraer subvistas para no repetir.

Un modificador devuelve una vista nueva

Cada .algo(...) toma la vista y devuelve una versión modificada, así que se encadenan:

Text("Etiqueta")
    .font(.headline)
    .padding()
    .background(.yellow)
    .clipShape(.rect(cornerRadius: 12))

El orden importa (de verdad)

Como cada modificador envuelve al anterior, cambiar el orden cambia el resultado. Compara:

// Padding y LUEGO fondo → el fondo incluye el padding
Text("A").padding().background(.blue)

// Fondo y LUEGO padding → el fondo va pegado al texto, el padding queda fuera
Text("B").background(.blue).padding()
Piensa en capas, de dentro hacia afuera

Lee una cadena de modificadores como una cebolla: el primero es el más interno, cada siguiente lo envuelve. .padding().background() = “añade espacio alrededor del texto, luego pinta el fondo de todo eso”. .background().padding() = “pinta el fondo del texto, luego añade espacio transparente fuera”. Cuando algo se ve raro, casi siempre es un orden de modificadores. Este es EL error clásico de SwiftUI, y entenderlo te ahorra horas.

Modificadores que usarás siempre

Modificador Qué hace
.font(_) / .bold() tipografía
.foregroundStyle(_) color del contenido
.padding(_) espacio alrededor
.background(_) fondo
.frame(...) tamaño
.cornerRadius(_) / .clipShape(_) esquinas y recorte
.shadow(...) sombra
.opacity(_) transparencia

Extraer subvistas

Cuando una vista crece, divídela en piezas con nombre. En vez de un body gigante, crea structs o propiedades computadas:

struct Perfil: View {
    var body: some View {
        VStack {
            avatar
            Text("William").font(.title)
        }
    }

    // subvista como propiedad computada
    var avatar: some View {
        Image(systemName: "person.circle.fill")
            .font(.system(size: 80))
            .foregroundStyle(.blue)
    }
}
💡
Divide sin miedo: las vistas son gratis

Como las vistas son structs ligeros, extraer subvistas no tiene coste de rendimiento — al contrario, ayuda a SwiftUI a actualizar solo lo que cambia. Si tu body no cabe en la pantalla, es señal de extraer. Un body que se lee de un vistazo es un body mantenible.

Modificador propio (ViewModifier)

Si repites la misma combinación de modificadores, encapsúlala:

struct Tarjeta: ViewModifier {
    func body(content: Content) -> some View {
        content
            .padding()
            .background(.thinMaterial)
            .clipShape(.rect(cornerRadius: 16))
    }
}

extension View {
    func estiloTarjeta() -> some View { modifier(Tarjeta()) }
}

// uso
Text("Contenido").estiloTarjeta()
⚔️ Estiliza y ordena
  1. Encadena .padding(), .background() y .clipShape() en un Text.
  2. Invierte el orden de .padding() y .background() y observa la diferencia.
  3. Extrae una parte de tu vista a una propiedad computada some View.
  4. Crea un ViewModifier propio que aplique tu “estilo de tarjeta” y úsalo en dos vistas.