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.
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.
- 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()
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)
}
}
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()
- Encadena
.padding(),.background()y.clipShape()en unText. - Invierte el orden de
.padding()y.background()y observa la diferencia. - Extrae una parte de tu vista a una propiedad computada
some View. - Crea un
ViewModifierpropio que aplique tu “estilo de tarjeta” y úsalo en dos vistas.