Si eres un iOS Developer, probablemente ya te hayas dado cuenta de una verdad universal en el desarrollo de aplicaciones móviles: casi todas las apps son, en su núcleo, listas de datos. Desde el feed de Instagram hasta la aplicación de Ajustes de tu iPhone, las listas son el componente fundamental de la interfaz de usuario.
En la programación Swift moderna, Apple nos ha regalado una herramienta increíblemente potente para manejar esto: List. Sin embargo, mostrar datos es solo la mitad de la batalla; la otra mitad es la presentación. Aquí es donde entra en juego el modificador ListStyle en SwiftUI.
En este tutorial, vamos a explorar a fondo qué es, cómo funciona y cómo puedes aprovechar este modificador en Xcode para construir interfaces espectaculares y nativas utilizando SwiftUI y Swift a través de todo el ecosistema de Apple: iOS, macOS y watchOS.
La Evolución: De UITableView a List en SwiftUI
Antes de sumergirnos en el diseño, es crucial entender de dónde venimos. Los veteranos de la programación Swift y Objective-C recordarán los días de UITableView y UICollectionView. Construir una lista requería configurar delegados (UITableViewDelegate), fuentes de datos (UITableViewDataSource), registrar celdas, calcular alturas y lidiar con el temido error de índices fuera de rango.
SwiftUI cambió las reglas del juego. Ahora, crear una lista requiere apenas unas pocas líneas de código declarativo.
import SwiftUI
struct BasicListView: View {
let lenguajes = ["Swift", "Kotlin", "Python", "Ruby"]
var body: some View {
List(lenguajes, id: \.self) { lenguaje in
Text(lenguaje)
}
}
}
Este código es hermoso y conciso. Pero, ¿qué sucede si queremos que esta lista parezca un menú de configuración en lugar de una lista de contactos? Ahí es donde entra la magia de los estilos.
¿Qué es ListStyle en SwiftUI?
El modificador ListStyle en SwiftUI es un método de instancia que aplicas a una vista List para alterar drásticamente su apariencia visual y su comportamiento de interacción, sin tener que cambiar absolutamente nada de la lógica de tus datos subyacentes o de las filas individuales.
Es la encarnación perfecta del paradigma declarativo de SwiftUI: tú describes qué quieres (una lista agrupada, una lista plana, un carrusel), y el framework se encarga de determinar cómo renderizarla de acuerdo con las Human Interface Guidelines (HIG) de la plataforma en la que se está ejecutando.
La sintaxis básica es sumamente sencilla en Swift:
List {
// Tus datos aquí
}
.listStyle(.nombreDelEstilo)
Lo fascinante para cualquier iOS Developer es que un mismo estilo puede comportarse de manera diferente dependiendo de si compilas tu proyecto en Xcode para un iPhone, un Mac o un Apple Watch.
Explorando los Estilos en iOS
iOS es el terreno de juego principal para la mayoría de los desarrolladores. En iOS, SwiftUI nos ofrece varios estilos predefinidos que cubren casi cualquier caso de uso imaginable.
1. PlainListStyle (.plain)
Este es el estilo por defecto en muchas situaciones. Presenta las filas extendiéndose de un borde al otro de la pantalla, con separadores sutiles entre ellas. Es ideal para aplicaciones de gran cantidad de datos donde quieres maximizar el espacio en pantalla.
import SwiftUI
struct PlainListExample: View {
var body: some View {
NavigationStack {
List(1...20, id: \.self) { index in
Text("Elemento \(index) de la lista")
}
.navigationTitle("Estilo Plain")
.listStyle(.plain) // Aplicando el estilo plano
}
}
}
Caso de uso ideal: Listas de contactos, feeds de mensajes, o cualquier pantalla donde el contenido es el rey y los bordes redondeados solo robarían espacio.
2. GroupedListStyle (.grouped)
Antes de iOS 13, este era el estándar para los menús de configuración. Agrupa las celdas en bloques y les da un fondo gris claro al View contenedor, haciendo que las celdas blancas destaquen. Las celdas siguen tocando los bordes laterales de la pantalla.
import SwiftUI
struct GroupedListExample: View {
var body: some View {
NavigationStack {
List {
Section(header: Text("Ajustes de Red")) {
Text("Wi-Fi")
Text("Bluetooth")
Text("Datos Móviles")
}
Section(header: Text("Notificaciones")) {
Text("Sonidos")
Text("Modo No Molestar")
}
}
.navigationTitle("Estilo Grouped")
.listStyle(.grouped) // Aplicando el estilo agrupado
}
}
}
3. InsetListStyle (.inset)
Similar al estilo plain, pero añade un pequeño margen (padding) a los lados de la lista. Fue un estilo transicional y hoy en día es menos utilizado por los desarrolladores, pero sigue siendo útil si quieres una lista plana que no toque los bordes del dispositivo.
4. InsetGroupedListStyle (.insetGrouped)
Este es actualmente el “Estándar de Oro” para cualquier iOS Developer. Si abres la aplicación de Ajustes en cualquier iPhone moderno, verás este estilo. Combina la agrupación de secciones con márgenes laterales y bordes elegantemente redondeados en los bloques de celdas.
Aporta una sensación de modernidad y limpieza absoluta a cualquier aplicación desarrollada en SwiftUI.
import SwiftUI
struct InsetGroupedListExample: View {
@State private var isAirplaneModeOn = false
var body: some View {
NavigationStack {
List {
Section {
Toggle("Modo Avión", isOn: $isAirplaneModeOn)
Text("Wi-Fi")
.badge("MiRedCasa")
Text("Bluetooth")
.badge("Activado")
} footer: {
Text("El modo avión desactiva todas las conexiones inalámbricas.")
}
Section {
Text("General")
Text("Centro de Control")
Text("Pantalla y Brillo")
}
}
.navigationTitle("Configuración")
.listStyle(.insetGrouped) // El estándar moderno de iOS
}
}
}
Adaptando el Diseño para macOS
Una de las promesas de la programación Swift y SwiftUI es “Aprende una vez, aplica en cualquier lugar”. Cuando abres tu proyecto en Xcode y añades un target para macOS, te darás cuenta de que los conceptos de listas cambian.
Los Mac tienen pantallas grandes y se operan con ratón o trackpad. Por ello, el modificador ListStyle en SwiftUI tiene opciones exclusivas y comportamientos adaptados para el escritorio.
1. SidebarListStyle (.sidebar)
Este es posiblemente el estilo más importante en macOS. Transforma tu lista en una barra lateral de navegación translúcida (como la que ves en el Finder o en la app Mail). Automáticamente aplica el material de fondo correcto y formatea los elementos para que parezcan opciones de menú de primer nivel.
import SwiftUI
struct MacOSSidebarExample: View {
let carpetas = ["Recientes", "Aplicaciones", "Documentos", "Descargas"]
@State private var seleccion: String? = "Documentos"
var body: some View {
NavigationSplitView {
List(carpetas, id: \.self, selection: $seleccion) { carpeta in
Label(carpeta, systemImage: "folder")
}
.listStyle(.sidebar) // Estilo nativo de barra lateral de macOS
.navigationTitle("Ubicaciones")
} detail: {
Text("Viendo el contenido de: \(seleccion ?? "Nada")")
}
}
}
Nota: En iOS y iPadOS, usar .sidebar dentro de un NavigationSplitView también renderizará una barra lateral correctamente adaptada al dispositivo táctil.
2. AlternatingRowBackgrounds (.inset(alternatesRowBackgrounds: true))
En aplicaciones de escritorio orientadas a datos (como hojas de cálculo o visores de logs), es muy común tener filas con colores de fondo alternos (por ejemplo, blanco y gris muy claro) para facilitar la lectura horizontal. En SwiftUI para macOS, puedes lograr esto fácilmente.
import SwiftUI
struct MacOSDataListExample: View {
let transacciones = ["Compra Supermercado", "Pago Netflix", "Recibo Luz", "Transferencia", "Café"]
var body: some View {
List(transacciones, id: \.self) { transaccion in
Text(transaccion)
.padding(.vertical, 4)
}
// Aplicamos el estilo con filas alternas para mejor lectura en Mac
.listStyle(.inset(alternatesRowBackgrounds: true))
}
}
Dominando la muñeca: watchOS
Si eres un iOS Developer que decide expandir su app al Apple Watch, te encontrarás con el entorno más restrictivo pero a la vez más innovador. La pantalla es diminuta y la interacción principal (aparte de los toques) es la Corona Digital (Digital Crown).
1. CarouselListStyle (.carousel)
Este estilo es exclusivo de watchOS. Cuando usas ListStyle en SwiftUI con el valor .carousel, tu lista adquiere un comportamiento dinámico. A medida que el usuario gira la Corona Digital, los elementos de la lista en los bordes superior e inferior se encogen y se desvanecen ligeramente, creando un efecto de cilindro rodante 3D que es visualmente muy atractivo y ayuda a enfocar la vista en el elemento central.
import SwiftUI
struct WatchOSCarouselExample: View {
let entrenamientos = ["Correr", "Nadar", "Bicicleta", "Yoga", "Fuerza", "HIIT"]
var body: some View {
NavigationStack {
List(entrenamientos, id: \.self) { entreno in
HStack {
Image(systemName: "figure.run.circle.fill")
.foregroundColor(.green)
.imageScale(.large)
Text(entreno)
.font(.headline)
}
.padding(.vertical, 8)
}
.navigationTitle("Entrenos")
.listStyle(.carousel) // El efecto mágico de watchOS
}
}
}
2. EllipticalListStyle (.elliptical)
Similar al carrusel, pero con un enfoque más pronunciado en curvar los bordes de la lista para que coincidan con la forma redonda u ovalada de la caja del Apple Watch. Es una excelente opción de diseño para hacer que la interfaz se sienta como si estuviera verdaderamente fusionada con el hardware.
Buenas Prácticas y Rendimiento para el Desarrollador
Al utilizar Swift y Xcode para construir estas listas, hay varias cosas que un buen profesional debe tener en mente:
- Rendimiento (Lazy Loading): Las listas en
SwiftUIson “perezosas” (lazy) por defecto. Esto significa que si tienes una lista con 10,000 elementos, SwiftUI solo renderizará las vistas de los elementos que son visibles actualmente en la pantalla. No necesitas preocuparte por reciclar celdas como lo hacías enUITableView. - Identificadores Únicos: Siempre proporciona un
idconfiable a tuListoForEach. Usar\.selfestá bien para arrays de Strings simples, pero para modelos de datos complejos, asegúrate de que tus estructuras conformen el protocoloIdentifiable. Esto permite a SwiftUI animar inserciones y eliminaciones correctamente sin importar elListStyleque estés utilizando. - Mantenlo Nativo: A menos que tu aplicación sea un juego o tenga una marca visual extremadamente agresiva y personalizada, confía en los estilos del sistema. Los usuarios están acostumbrados a cómo se ven y se comportan las listas en sus dispositivos. Forzar un
.plainstyle e intentar recrear un diseño agrupado manualmente con paddings y sombras es una mala idea que se romperá en futuras actualizaciones de iOS.
El Poder de la Multiplataforma (Cross-Platform)
¿Qué pasa si tienes una sola base de código en Xcode para todas las plataformas? Puedes usar directivas de compilación, pero SwiftUI es lo suficientemente inteligente.
Si aplicas .listStyle(.automatic), SwiftUI decidirá por ti. Usará un estilo plano en iOS, una barra lateral si está en la jerarquía correcta en macOS, y un carrusel en watchOS.
Si necesitas un control más granular basado en la plataforma sin usar #if os(iOS), puedes crear tus propios ViewModifiers o extensiones:
import SwiftUI
extension View {
@ViewBuilder
func adaptiveListStyle() -> some View {
#if os(iOS)
self.listStyle(.insetGrouped)
#elseif os(macOS)
self.listStyle(.sidebar)
#else
self.listStyle(.carousel)
#endif
}
}
// Uso:
// List { ... }.adaptiveListStyle()
Conclusión
El modificador ListStyle en SwiftUI es una herramienta pequeña pero fundamental en el arsenal de cualquier iOS Developer. Demuestra el verdadero poder de la programación Swift declarativa: la separación total entre el contenido (tus datos y filas) y su presentación (el diseño del sistema).
Si tienes cualquier duda sobre este artículo, contacta conmigo y estaré encantado de ayudarte . Puedes contactar conmigo en mi perfil de X o en mi perfil de Instagram.










