View in English

  • Apple Developer
    • Get Started

    Explore Get Started

    • Overview
    • Learn
    • Apple Developer Program

    Stay Updated

    • Latest News
    • Hello Developer
    • Platforms

    Explore Platforms

    • Apple Platforms
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    • App Store

    Featured

    • Design
    • Distribution
    • Games
    • Accessories
    • Web
    • Home
    • CarPlay
    • Technologies

    Explore Technologies

    • Overview
    • Xcode
    • Swift
    • SwiftUI

    Featured

    • Accessibility
    • App Intents
    • Apple Intelligence
    • Games
    • Machine Learning & AI
    • Security
    • Xcode Cloud
    • Community

    Explore Community

    • Overview
    • Meet with Apple events
    • Community-driven events
    • Developer Forums
    • Open Source

    Featured

    • WWDC
    • Swift Student Challenge
    • Developer Stories
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Centers
    • Documentation

    Explore Documentation

    • Documentation Library
    • Technology Overviews
    • Sample Code
    • Human Interface Guidelines
    • Videos

    Release Notes

    • Featured Updates
    • iOS
    • iPadOS
    • macOS
    • watchOS
    • visionOS
    • tvOS
    • Xcode
    • Downloads

    Explore Downloads

    • All Downloads
    • Operating Systems
    • Applications
    • Design Resources

    Featured

    • Xcode
    • TestFlight
    • Fonts
    • SF Symbols
    • Icon Composer
    • Support

    Explore Support

    • Overview
    • Help Guides
    • Developer Forums
    • Feedback Assistant
    • Contact Us

    Featured

    • Account Help
    • App Review Guidelines
    • App Store Connect Help
    • Upcoming Requirements
    • Agreements and Guidelines
    • System Status
  • Quick Links

    • Events
    • News
    • Forums
    • Sample Code
    • Videos
 

Videos

Abrir menú Cerrar menú
  • Colecciones
  • Todos los videos
  • Información

Más videos

  • Información
  • Resumen
  • Código
  • Conoce el diseño espacial de SwiftUI

    Explora nuevas herramientas para crear experiencias espaciales con SwiftUI. Conoce los conceptos básicos de las vistas 3D SwiftUI en visionOS, personaliza diseños existentes con alineaciones de profundidad y usa modificadores para rotar y posicionar vistas en el espacio. Descubre cómo usar contenedores espaciales para alinear vistas en el mismo espacio 3D, lo que te ayudará a crear apps envolventes y atractivas.

    Capítulos

    • 0:00 - Introducción
    • 2:47 - Vistas 3D
    • 7:18 - Alineaciones de profundidad
    • 11:41 - Diseño de rotación
    • 16:28 - Contenedores espaciales
    • 19:22 - Próximos pasos

    Recursos

    • Canyon Crosser: Building a volumetric hike-planning app
    • Human Interface Guidelines: Designing for visionOS
      • Video HD
      • Video SD

    Videos relacionados

    WWDC25

    • Mejor juntos: SwiftUI y RealityKit

    WWDC22

    • Compose custom layouts with SwiftUI

    WWDC19

    • Building Custom Views with SwiftUI
  • Buscar este video…
    • 3:02 - Robot Image Frame

      // Some views have fixed frames
      
      Image("RobotHead")
        .border(.red)
    • 3:05 - Color Frame

      // Some views have flexible frames
      
      Color.blue
        .border(.red)
    • 3:15 - Layout Composed Frame

      // Layouts compose the frames of their children
      
      VStack {
        Image("RobotHead")
          .border(.red)
        Image("RobotHead")
          .border(.red)
      }
      .border(.yellow)
    • 4:00 - Model3D Frame

      // Some views have fixed depth
      
      Model3D(named: "Robot")
        .debugBorder3D(.red)
    • 4:25 - Zero Depth Views

      // Many views have 0 depth
      
      HStack {
        Image("RobotHead")
          .debugBorder3D(.red)
        Text("Hello! I'm a piece of text. I have 0 depth.")
          .debugBorder3D(.red)
        Color.blue
          .debugBorder3D(.red)
          .frame(width: 200, height: 200)
      }
    • 4:41 - RealityView Depth

      // RealityView takes up all available space including depth
      
      RealityView { content in
        // Setup RealityView content
      }
      .debugBorder3D(.red)
    • 4:56 - GeometryReader3D Depth

      // GeometryReader3D uses all available depth
      
      GeometryReader3D { proxy in
        // GeometryReader3D content
      }
      .debugBorder3D(.red)
    • 5:01 - Model3D scaledToFit3D

      // Scaling a Model3D to fit available space
      
      Model3D(url: robotURL) {aresolved in
        resolved.resizable()
      }aplaceholder: {
        ProgressView()
      }
      .scaledToFit3D()
      .debugBorder3D(.red)
    • 6:15 - ZStack depth

      // ZStack composes subview depths
      
      ZStack {
        Model3D(named: "LargeRobot")
          .debugBorder3D(.red)
        Model3D(named: "BabyBot")
          .debugBorder3D(.red)
      }
      .debugBorder3D(.yellow)
    • 6:33 - ZStack with RealityView

      // ZStack composes subview depths
      
      ZStack {
        RealityView { ... }
          .debugBorder3D(.red)
        Model3D(named: "BabyBot")
          .debugBorder3D(.red)
      }
      .debugBorder3D(.yellow)
    • 6:57 - Layouts are 3D

      // HStack also composes subview depths
      
      HStack {
        Model3D(named: "LargeRobot")
          .debugBorder3D(.red)
        Model3D(named: "BabyBot")
          .debugBorder3D(.red)
      }
      .debugBorder3D(.yellow)
    • 7:50 - ResizableRobotView

      struct ResizableRobotView: View {
        let asset: Model3DAsset
      
        var body: some View {
          Model3D(asset: asset) { resolved in
            resolved
              .resizable()
          }
          .scaledToFit3D()
        }
      }
    • 8:11 - Robot Profile 1

      //`Layout` types back align views by default
      
      struct RobotProfile: View {
        let robot: Robot
      
        var body: some View {
          VStack {
            ResizableRobotView(asset: robot.model3DAsset)
            RobotNameCard(robot: robot)
          }
          .frame(width: 300)
        }
      }
    • 8:38 - Customizing Vertical Alignment

      // Customizing vertical alignment
      
      HStack(alignment: .bottom) {
        Image("RobotHead")
          .border(.red)
        Color.blue
          .frame(width: 100, height: 100)
          .border(.red)
      }
      .border(.yellow)
    • 8:52 - Customizing Depth Alignment

      // Customizing depth alignments
      
      struct RobotProfile: View {
        let robot: Robot
      
        var body: some View {
          VStackLayout().depthAlignment(.front) {
            ResizableRobotView(asset: robot.model3DAsset)
            RobotNameCard(robot: robot)
          }
          .frame(width: 300)
        }
      }
    • 9:45 - Robot Favorite Row

      struct FavoriteRobotsRow: View {
        let robots: [Robot]
      
        var body: some View {
          HStack {
            RobotProfile(robot: robots[2])
            RobotProfile(robot: robots[0])
            RobotProfile(robot: robots[1])
          }
        }
      }
    • 10:27 - Custom Depth Alignment ID

      // Defining a custom depth alignment guide
      
      struct DepthPodiumAlignment: DepthAlignmentID {
        static func defaultValue(in context: ViewDimensions3D) -> CGFloat {
          context[.front]
        }
      }
      
      extension DepthAlignment {
        static let depthPodium = DepthAlignment(DepthPodiumAlignment.self)
      }
    • 10:51 - Customizing Depth Alignment Guides

      // Views can customize their alignment guides
      
      struct FavoritesRow: View {
        let robots: [Robot]
      
        var body: some View {
          HStackLayout().depthAlignment(.depthPodium) {
              RobotProfile(robot: robots[2])
              RobotProfile(robot: robots[0])
                .alignmentGuide(.depthPodium) {
                  $0[DepthAlignment.back]
                }
              RobotProfile(robot: robots[1])
            		.alignmentGuide(.depthPodium) {
                  $0[DepthAlignment.center]
                }
          }
        }
      }
    • 12:00 - Rotation3DEffect

      // Rotate views using visual effects
      
      Model3D(named: "ToyRocket")
        .rotation3DEffect(.degrees(45), axis: .z)
    • 12:10 - Rotation3DLayout

      // Rotate using any axis or angle
      
      HStackLayout().depthAlignment(.front) {
        RocketDetailsCard()
        Model3D(named: "ToyRocket")
        	.rotation3DLayout(.degrees(isRotated ? 45 : 0), axis: .z)
      }
    • 14:42 - Pet Radial Layout

      // Custom radial Layout
      
      struct PetRadialLayout: View {
        let pets: [Pet]
      
        var body: some View {
          MyRadialLayout {
            ForEach(pets) { pet in
              PetImage(pet: pet)
            }
          }
        }
      }
    • 14:56 - Rotated Robot Carousel

      struct RobotCarousel: View {
        let robots: [Robot]
      
        var body: some View {
      		VStack {
            Spacer()
            MyRadialLayout {
              ForEach(robots) { robot in
                ResizableRobotView(asset: robot.model3DAsset)
                	.rotation3DLayout(.degrees(-90), axis: .x)
              }
            }
            .rotation3DLayout(.degrees(90), axis: .x)
        }
      }
    • 17:00 - Spatial Container

      // Aligning views in 3D space
      
      SpatialContainer(alignment: .topTrailingBack) {
        LargeBox()
        MediumBox()
        SmallBox()
      }
    • 17:35 - Spatial Overlay

      // Aligning overlayed content
      
      LargeBox()
        .spatialOverlay(alignment: .bottomLeadingFront) {
          SmallBox()
        }
    • 17:47 - Selection Ring Spatial Overlay

      struct RobotCarouselItem: View {
        let robot: Robot
        let isSelected: Bool
      
        var body: some View {
          ResizableRobotView(asset: robot.model3DAsset)
      			.spatialOverlay(alignment; .bottom) {
              if isSelected {
                ResizableSelectionRingModel()
              }
        }
      }
    • 18:32 - DebugBorder3D

      extension View {
        func debugBorder3D(_ color: Color) -> some View {
          spatialOverlay {
      			ZStack {
      				Color.clear.border(color, width: 4)
              ZStack {
                Color.clear.border(color, width: 4)
                Spacer()
                Color.clear.border(color, width: 4)
              }
              .rotation3DLayout(.degrees(90), axis: .y)
      				Color.clear.border(color, width: 4)
            }
          }
        }
    • 0:00 - Introducción
    • Las nuevas capacidades de diseño 3D de SwiftUI en visionOS 26 le permiten crear apps 3D utilizando la sintaxis declarativa de SwiftUI. Estas capacidades se basan en conceptos de diseño 2D existentes y brindan soporte integrado para animaciones, cambio de tamaño y gestión de estados. La app de ejemplo BOT-anist demuestra cómo las personas pueden personalizar y catalogar robots en un jardín virtual. Si nunca trabajaste con diseños de SwiftUI, consulta “Crea diseños personalizados con SwiftUI” y “Compone diseños personalizados con SwiftUI” antes de profundizar en este contenido.

    • 2:47 - Vistas 3D
    • En SwiftUI, el sistema de diseño calcula el ancho, la altura y las posiciones X e Y para cada vista de una app. Algunas vistas tienen marcos fijos, mientras que otras tienen marcos flexibles que llenan el espacio disponible proporcionado por el padre. En visionOS, este concepto se extiende a tres dimensiones. Cada vista tiene una profundidad y una posición Z además de ancho y alto. El sistema de diseño se comporta de manera similar al 2D pero se aplica al espacio 3D. Las vistas pueden tener profundidad fija, flexible o cero. GeometryReader3D y Model3D con el modificador 'redimensionable' puede ocupar toda la profundidad disponible. El nuevo modificador 'scaledToFit3D' ayuda a mantener las relaciones de aspecto mientras se cambia el tamaño. Las ventanas tienen una propuesta de profundidad de raíz fija, mientras que los volúmenes tienen una profundidad redimensionable. El contenido fuera de esta profundidad puede recortarse por el sistema. ZStack compone profundidades como VStack compone alturas y los tipos de diseño existentes como HStack y VStack son automáticamente 3D en visionOS, aplicando comportamientos predeterminados sensatos para la profundidad, como alinear los elementos a lo largo de sus partes posteriores.

    • 7:18 - Alineaciones de profundidad
    • Las alineaciones de profundidad son una nueva característica de visionOS 26 que puede utilizar para personalizar las vistas de posicionamiento en el espacio 3D, de forma similar a cómo funcionan las alineaciones verticales y horizontales en 2D. Este enfoque es especialmente útil al crear ventanas volumétricas o visualizar modelos 3D. El ejemplo demuestra cómo utilizar la alineación de profundidad para mejorar la legibilidad de una vista del perfil de un robot. Al aplicar el modificador de alineación de profundidad '.front' a la tarjeta con el nombre del robot, este se mueve al frente, lo que hace que sea más fácil de ver. Para escenarios más complejos, puede crear alineaciones de profundidad personalizadas. El ejemplo muestra cómo definir un 'DepthPodiumAlignment' personalizado para escalonar tres vistas de perfil de robot en profundidad, con el robot favorito más cercano al espectador, creando una sensación de prominencia.

    • 11:41 - Diseño de rotación
    • visionOS 26 presenta el nuevo modificador 'rotation3DLayout' para abordar las limitaciones del modificador 'rotation3DEffect' existente. El modificador 'rotation3DEffect' solo aplica rotaciones visuales sin afectar el sistema de diseño, lo que causa problemas al rotar vistas dentro de contenedores como HStacks. 'rotation3DEffect' sigue siendo útil cuando quieres animar una vista sin afectar los cuadros de los demás. El modificador 'rotation3DLayout' modifica el marco de una vista rotada dentro del sistema de diseño, lo que permite ajustes adecuados de tamaño y ubicación, lo que permite diseños 3D más complejos. Por ejemplo, puedes usarlo para crear un carrusel de robot orientado horizontalmente girando un RadialLayout personalizado 90 grados a lo largo del eje X. Cada robot del carrusel gira en sentido contrario para quedar en posición vertical. Se pueden aplicar ajustes adicionales, como el uso de un VStack con un espaciador, para colocar el carrusel al ras de la base del volumen, creando una IU 3D pulida y visualmente atractiva.

    • 16:28 - Contenedores espaciales
    • 'SpatialContainer' y 'SpatialOverlay' son nuevas herramientas en SwiftUI para diseño 3D. SpatialContainer permite anidar múltiples vistas en el espacio 3D con opciones de alineación, mientras que SpatialOverlay superpone una sola vista sobre otra. El ejemplo utiliza SpatialOverlay para crear un anillo de selección para robots en un carrusel, alineándolo con la parte inferior del robot. El modificador de ejemplo 'debugBorder3D' se demuestra como una extensión de View, utilizando 'SpatialOverlay', ZStacks y 'rotation3DLayout' para agregar bordes 3D a cualquier Model3D con fines de depuración.

    • 19:22 - Próximos pasos
    • SwiftUI ahora permite el desarrollo de apps 3D utilizando modificadores 2D familiares y nuevas API 3D. Puedes combinar SwiftUI con RealityKit para obtener una funcionalidad mejorada. Encuentra ejemplos de esta integración en "Better Together: SwiftUI y RealityKit".

Developer Footer

  • Videos
  • WWDC25
  • Conoce el diseño espacial de SwiftUI
  • Open Menu Close Menu
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    • App Store
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • Icon Composer
    • SF Symbols
    Open Menu Close Menu
    • Accessibility
    • Accessories
    • Apple Intelligence
    • Audio & Video
    • Augmented Reality
    • Business
    • Design
    • Distribution
    • Education
    • Games
    • Health & Fitness
    • In-App Purchase
    • Localization
    • Maps & Location
    • Machine Learning & AI
    • Security
    • Safari & Web
    Open Menu Close Menu
    • Documentation
    • Downloads
    • Sample Code
    • Videos
    Open Menu Close Menu
    • Help Guides & Articles
    • Contact Us
    • Forums
    • Feedback & Bug Reporting
    • System Status
    Open Menu Close Menu
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles
    • Feedback Assistant
    Open Menu Close Menu
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program
    • Mini Apps Partner Program
    • News Partner Program
    • Video Partner Program
    • Security Bounty Program
    • Security Research Device Program
    Open Menu Close Menu
    • Meet with Apple
    • Apple Developer Centers
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Academies
    • WWDC
    Read the latest news.
    Get the Apple Developer app.
    Copyright © 2026 Apple Inc. All rights reserved.
    Terms of Use Privacy Policy Agreements and Guidelines