La llegada de la computación espacial ha marcado un antes y un después en el ecosistema de Apple. Para un iOS developer, la transición de pensar en pantallas rectangulares planas (iPhone y iPad) a un lienzo infinito en 3D puede parecer desalentadora. Sin embargo, si ya dominas Swift y SwiftUI, tienes el 90% del camino recorrido.
Hoy vamos a sumergirnos en uno de los conceptos de interfaz más distintivos y potentes de visionOS: los Ornaments en SwiftUI. Si estás buscando llevar tu programación Swift al siguiente nivel y desarrollar aplicaciones inmersivas utilizando Xcode, este tutorial es tu punto de partida obligatorio.
Introducción: ¿Qué son los Ornaments y por qué importan?
En el desarrollo tradicional de iOS, estamos acostumbrados a TabBars, NavigationBars y Toolbars que viven dentro de los límites de la vista segura (Safe Area). En visionOS, las reglas cambian. Las ventanas flotan en el espacio físico del usuario, y el contenido no debería sentirse encerrado.
Aquí entran los Ornaments.
Un Ornament (o adorno) en SwiftUI es un elemento de interfaz que flota en un plano Z separado (ligeramente por delante de la ventana principal), anclado a un borde de tu ventana, pero visualmente distinto de ella. Piensa en ellos como barras de herramientas flotantes, menús laterales o controles de reproducción que acompañan a tu ventana principal sin obstruir el contenido central.
Para un iOS developer, entender los ornaments es crucial porque son el estándar de navegación y control en visionOS. No usar ornaments en visionOS es como no usar una UINavigationBar en iOS: técnicamente posible, pero una mala experiencia de usuario.
Requisitos Previos: Preparando tu Entorno en Xcode
Antes de escribir una sola línea de código, asegúrate de tener las herramientas adecuadas. La programación Swift para computación espacial requiere hardware y software actualizado.
- Xcode 15 o superior: Necesitas la última versión estable o beta que incluya el SDK de visionOS.
- Apple Silicon Mac: Aunque se puede desarrollar en Intel, el simulador de visionOS es exigente.
- Conocimientos de SwiftUI: Este tutorial asume que entiendes
@State,Viewy modificadores básicos.
Abre Xcode, crea un nuevo proyecto seleccionando la plantilla de visionOS y asegúrate de elegir SwiftUI como la tecnología de interfaz.
Anatomía de un Ornament en SwiftUI
La magia ocurre gracias a un modificador de vista específico introducido para visionOS. A diferencia de los modificadores de estilo tradicionales, este define una posición espacial.
La firma básica del modificador es:
.ornament(
visibility: Visibility,
attachmentAnchor: OrnamentAttachmentAnchor,
contentAlignment: Alignment,
ornament: () -> View
)
Desglosemos esto para el desarrollador de Swift:
- Visibility: Controla si el ornament es visible o está oculto (útil para modos de inmersión).
- AttachmentAnchor: Define “dónde” se pega el ornament relativo a la ventana (Arriba, Abajo, Izquierda, Derecha).
- ContentAlignment: Define cómo se alinea el contenido del ornament respecto a su ancla.
- Ornament: El
Closureque devuelve la vista de SwiftUI que quieres mostrar.
Tutorial Paso a Paso: Creando tu Primer Ornament
Vamos a construir una aplicación sencilla de visualización de fotos. Tendremos una ventana principal con una imagen y utilizaremos ornaments en SwiftUI para los controles de “Siguiente”, “Anterior” y “Favorito”.
Paso 1: La Vista Principal
Primero, definamos una estructura básica en nuestro archivo ContentView.swift.
import SwiftUI
import RealityKit
struct ContentView: View {
@State private var currentImageIndex = 0
let images = ["paisaje1", "paisaje2", "paisaje3"] // Asegúrate de tener estas imágenes en tus Assets
var body: some View {
VStack {
Image(images[currentImageIndex])
.resizable()
.aspectRatio(contentMode: .fit)
.cornerRadius(20)
.padding()
}
// Aquí aplicaremos el ornament
}
}
Si ejecutas esto en el simulador de Xcode, verás una ventana flotante estándar con tu imagen.
Paso 2: Implementando el Bottom Ornament (La Barra de Herramientas)
El uso más común de un ornament es como una barra de herramientas inferior. Apple recomienda esto porque es ergonómico para los ojos y las manos del usuario (si usa interacción directa).
Añade el siguiente modificador al VStack o a la Image:
<pre class="wp-block-syntaxhighlighter-code">.ornament(
attachmentAnchor: .scene(.bottom),
contentAlignment: .bottom
) {
// Contenido del Ornament
HStack(spacing: 20) {
Button(action: {
if currentImageIndex > 0 { currentImageIndex -= 1 }
}) {
Label("Anterior", systemImage: "arrow.left")
}
Button(action: {
// Lógica de favorito
}) {
Label("Favorito", systemImage: "heart")
}
Button(action: {
if currentImageIndex < images.count - 1 { currentImageIndex += 1 }
}) {
Label("Siguiente", systemImage: "arrow.right")
}
}
.padding()
.glassBackgroundEffect() // ¡Crucial para el look nativo!
}</pre>
Análisis para el iOS Developer:
.scene(.bottom): Le dice a visionOS que este elemento pertenece al borde inferior de la “escena” (ventana)..glassBackgroundEffect(): En iOS, usamos colores sólidos o desenfoques. En visionOS, el material estándar es el “cristal” (Glass). Este modificador adapta el fondo automáticamente a la iluminación del entorno virtual. Sin esto, tus botones flotarían de forma extraña sin un contenedor visual.
Paso 3: Ornaments Laterales (Side Ornaments)
A veces, una barra inferior no es suficiente. Quizás necesitas una lista de filtros o categorías. Los ornaments laterales son perfectos para navegación secundaria.
Vamos a añadir un menú lateral a nuestra app de fotos. Agrega este segundo modificador a tu vista (puedes encadenar múltiples ornaments):
.ornament(
attachmentAnchor: .scene(.leading),
contentAlignment: .leading
) {
VStack(spacing: 12) {
ForEach(["Naturaleza", "Urbano", "Retrato"], id: \.self) { category in
Button(action: {
print("Categoría seleccionada: \(category)")
}) {
Text(category)
.padding(.horizontal, 8)
}
.buttonStyle(.plain) // Estilo más limpio para listas
}
}
.padding()
.glassBackgroundEffect()
}
Aquí hemos cambiado el attachmentAnchor a .scene(.leading). Observa cómo SwiftUI maneja automáticamente el espaciado para que no se solape con la ventana principal.
Profundizando en la Personalización y el Diseño
Como experto en programación Swift, sabes que “funciona” no es lo mismo que “se siente bien”. En visionOS, el diseño espacial es delicado.
El sistema de coordenadas del Ornament
Es vital entender que el sistema de coordenadas del ornament es relativo a su ancla.
Si usas contentAlignment: .bottom, el ornament crecerá hacia arriba desde el borde inferior de su propio marco, pero permanecerá pegado al borde inferior de la ventana principal.
Interactividad y Estado
Los ornaments son vistas completas de SwiftUI. Esto significa que pueden tener su propio @State, @StateObject, o recibir @Binding de la vista padre.
Un error común de un iOS developer novato en visionOS es olvidar que el ornament comparte el ciclo de vida de la ventana a la que está adjunto. Si cierras la ventana, el ornament desaparece.
Ejemplo de manejo de estado complejo:
struct FilterOrnament: View {
@Binding var selectedFilter: FilterType
var body: some View {
Picker("Filtro", selection: $selectedFilter) {
Text("Original").tag(FilterType.none)
Text("Vívido").tag(FilterType.vivid)
Text("B/N").tag(FilterType.bw)
}
.pickerStyle(.segmented)
.padding()
.glassBackgroundEffect()
}
}
Llamada desde la vista principal:
.ornament(attachmentAnchor: .scene(.top)) {
FilterOrnament(selectedFilter: $currentFilter)
}
Mejores Prácticas de Apple (Human Interface Guidelines)
Para destacar como un gran desarrollador en el ecosistema, y no solo uno que escribe código, debes seguir las guías de diseño. Al usar Xcode para visionOS:
- Evita el desorden: No llenes los cuatro lados de la ventana con ornaments. Usa el borde inferior para controles principales y el izquierdo para navegación (Tab bar vertical). Deja los otros lados libres si es posible.
- Uso del Glass Effect: Siempre usa
.glassBackgroundEffect()para el contenedor del ornament. Esto asegura legibilidad y consistencia con el sistema operativo. - Tamaño de los toques: Recuerda que en visionOS, los ojos son el cursor. Los botones deben ser lo suficientemente grandes y tener suficiente espaciado para que el sistema de seguimiento ocular sepa exactamente qué estás mirando. SwiftUI en visionOS añade automáticamente un “hover effect” visual cuando miras un elemento interactivo; no rompas esto con estilos de botón personalizados que eliminen el feedback visual.
- Jerarquía: La ventana principal es el contenido. El ornament es el control. No pongas contenido primario (como texto largo para leer) en un ornament.
Diferencias Clave para el iOS Developer
Si vienes de programar para iPhone, aquí hay una tabla comparativa mental para ayudarte a adaptar tu programación Swift:
| Concepto en iOS | Equivalente/Evolución en visionOS |
|---|---|
UITabBar (Bottom) | TabView adaptado automáticamente como un Ornament lateral izquierdo o flotante. |
UINavigationBar | A menudo reemplazado por Ornaments superiores o títulos dentro de la ventana, ya que la navegación “push” se siente diferente en 3D. |
Toolbar | Ornaments inferiores (.bottom). |
Safe Area | Menos relevante para “muescas” (notch), pero crítica para asegurar que los ornaments no se corten con muebles virtuales u otras ventanas. |
| Xcode Preview | Ahora es interactiva en 3D. Úsala constantemente para ver la profundidad de tus ornaments. |
Técnicas Avanzadas: Ornaments Dinámicos
Una característica potente de SwiftUI es su capacidad reactiva. Puedes ocultar o mostrar ornaments o cambiar su posición basándote en el contexto.
Imagina un reproductor de video. Cuando el video se está reproduciendo, quieres que los controles desaparezcan.
struct VideoPlayerView: View {
@State private var showControls = true
var body: some View {
VideoPlayer(player: player)
.onTapGesture {
withAnimation {
showControls.toggle()
}
}
.ornament(
visibility: showControls ? .visible : .hidden, // Control dinámico
attachmentAnchor: .scene(.bottom)
) {
PlayerControls()
.glassBackgroundEffect()
}
}
}
El parámetro visibility en el modificador .ornament es la clave aquí. Al animar el estado showControls, el ornament se desvanece suavemente, proporcionando esa experiencia cinematográfica inmersiva que se espera en las gafas de Apple.
Solución de Problemas Comunes en Xcode
Al desarrollar con ornaments en SwiftUI, es posible que te encuentres con algunos obstáculos. Aquí tienes soluciones rápidas para el iOS developer:
- El Ornament no aparece:
- Verifica que no estás en un
ImmersiveSpacesin una ventana principal definida, o que el ancla (attachmentAnchor) no está fuera del campo de visión. - Asegúrate de que el
.glassBackgroundEffect()está aplicado; a veces, sin fondo, el texto blanco sobre un entorno claro es invisible.
- Verifica que no estás en un
- Los botones no responden:
- A veces, si un ornament se solapa demasiado con la ventana principal, la ventana puede “robar” los eventos de entrada. Intenta ajustar el
contentAlignmentpara alejarlo ligeramente.
- A veces, si un ornament se solapa demasiado con la ventana principal, la ventana puede “robar” los eventos de entrada. Intenta ajustar el
- El diseño se rompe al redimensionar la ventana:
- Las ventanas en visionOS son redimensionables por el usuario. Asegúrate de que tu ornament usa
HStack,VStackySpacercorrectamente para adaptarse a anchos variables, tal como lo harías en iPadOS.
- Las ventanas en visionOS son redimensionables por el usuario. Asegúrate de que tu ornament usa
El Futuro de la Programación Swift en Computación Espacial
Dominar los ornaments en SwiftUI es solo el primer paso. A medida que Apple refine visionOS, es probable que veamos nuevos tipos de anclajes y comportamientos más inteligentes.
Para ti, como iOS developer, la inversión en aprender esto ahora es enorme. La sintaxis es pura Swift, el entorno es tu familiar Xcode, pero el resultado es futurista. Estás reutilizando tu lógica de negocio y tus habilidades de gestión de estado, pero presentándolas en una dimensión completamente nueva.
Recuerda:
- Los ornaments viven fuera de la ventana.
- Usan coordenadas relativas a la escena.
- Son esenciales para la UX de visionOS.
- Requieren
.glassBackgroundEffect()para verse nativos.
Conclusión
La transición a visionOS es una oportunidad de oro para cualquier iOS developer. No se trata de aprender un nuevo lenguaje, sino de expandir tu vocabulario de diseño y arquitectura en SwiftUI.
Los ornaments son el puente perfecto entre lo que ya sabes (barras de herramientas, botones, estado) y el nuevo mundo (profundidad, espacio, inmersión). Al dominar los ornaments en SwiftUI, no solo estás creando mejores apps para las Vision Pro, estás posicionándote a la vanguardia de la programación Swift.
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










