View in English

  • Global Nav Open Menu Global Nav Close Menu
  • Apple Developer
Search
Cancel
  • Apple Developer
  • News
  • Discover
  • Design
  • Develop
  • Distribute
  • Support
  • Account
Only search within “”

Quick Links

5 Quick Links

Videos

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

Más videos

  • Información
  • Resumen
  • Transcripción
  • Código
  • Novedades de SwiftUI

    Descubre las novedades de SwiftUI que permiten crear fantásticas apps para cualquier plataforma de Apple. Exploraremos cómo darle a tu app un aspecto completamente nuevo con Liquid Glass. Descubre cómo aumentar el rendimiento con mejoras al marco y nuevos instrumentos, e integra capacidades avanzadas como contenido web y edición de texto enriquecido. También te mostraremos cómo SwiftUI se está expandiendo a más lugares, incluido el diseño de vistas en tres dimensiones.

    Capítulos

    • 0:00 - Introducción
    • 1:22 - Haz que el nuevo diseño brille
    • 6:59 - Bases del marco
    • 14:33 - SwiftUI en el sistema
    • 20:04 - Expandir las vistas de SwiftUI
    • 25:01 - Próximos pasos

    Recursos

    • Adopting Liquid Glass
    • Applying Liquid Glass to custom views
    • Human Interface Guidelines
    • Populating SwiftUI menus with adaptive controls
      • Video HD
      • Video SD

    Videos relacionados

    WWDC25

    • Adopción de la concurrencia en Swift
    • Codificación conjunta: Crea una experiencia de texto enriquecida en SwiftUI con AttributedString
    • Codificación conjunta: Explora la localización con Xcode
    • Conoce el diseño espacial de SwiftUI
    • Conoce WebKit para SwiftUI
    • Crea una app de SwiftUI con el nuevo diseño
    • Explora la concurrencia en SwiftUI
    • Lleva los gráficos Swift a la tercera dimensión
    • Mejor juntos: SwiftUI y RealityKit
    • Mejora el diseño de tu app para iPad
    • Novedades de visionOS 26
    • Novedades de widgets
    • Novedades del renderizado de Metal para apps inmersivas
    • Optimiza el rendimiento de SwiftUI con instrumentos
    • Personaliza tu app para acceso asistido
    • Prepara el escenario con SwiftUI en visionOS
  • Buscar este video…

    Hola, soy Anna. Y yo soy Peter. Somos ingenieros del equipo de SwiftUI. Estamos encantados de hablar contigo sobre las novedades de SwiftUI. Desde las mejoras de rendimiento a bajo nivel hasta los botones de la interfaz de usuario, hay algunas mejoras importantes para compartir en todo el sistema. Es más fácil interactuar con el texto y el contenido basado en la web, y SwiftUI está en aún más lugares. Una de las grandes aficiones mías y de Anna, justo por detrás de SwiftUI, es tomar fotos mientras hacemos senderismo. Peter y yo creamos una app para planificar y compartir nuestros viajes. Incorpora muchas de las mejoras de SwiftUI para lograr que se vea y se sienta genial. Primero, mostraré todas las nuevas funcionalidades del sistema y cómo conseguimos que la app se destaque. Mostraré las mejoras en el rendimiento, las animaciones y el diseño. Peter te enseñará los nuevos lugares en los que puedes utilizar SwiftUI en todas las plataformas de Apple. Por último, destacará las funcionalidades ampliadas en las vistas de SwiftUI, incluyendo soporte para contenido web y texto enriquecido. Empecemos por cómo hacer que tu app se destaque de verdad con un nuevo diseño. El nuevo sistema de diseño permite una experiencia brillante y fluida que es uniforme en todas las plataformas de Apple.

    Después de que Peter y yo volvemos a compilar nuestra app, adquiere una apariencia completamente nueva. La estructura de nuestra app no cambió, pero los contenedores de navegación se actualizaron para el nuevo diseño.

    En iPad y macOS, la barra lateral de nuestra app tiene un aspecto vidrioso que refleja el contenido que la rodea. También se actualizaron las barras de pestañas. En el iPhone, tienen una nueva apariencia más compacta.

    Además de las barras de pestañas, la mayoría de los elementos de la barra de herramientas aparecen ahora en Liquid Glass. Durante las transiciones de navegación, estos elementos pueden incluso transformarse. Mira.

    Nuestra app usa la nueva API de espaciador de la barra de herramientas para ajustar las secciones de los elementos de la barra. Usamos un espaciador fijo para separar los botones arriba y abajo del botón de configuración.

    Para que los elementos de la barra de herramientas se destaquen más, Liquid Glass permite el uso de un tinte en las barras de herramientas.

    Peter y yo aplicamos un estilo de botón prominente con borde y un color matizado para lograr este efecto. Cuando las personas se desplazan hacia abajo en nuestra app, la barra de herramientas aplica un efecto de desenfoque al contenido en el borde sobre el que se desplaza. Este efecto de borde de desplazamiento garantiza que el contenido de nuestra barra permanezca legible independientemente de lo que haya debajo.

    Para encontrar el próximo viaje, las personas a menudo lo buscan. La búsqueda ahora está alineada en la parte inferior del iPhone, por lo que es más ergonómico alcanzarla. Nuestro código existente coloca el modificador de búsqueda en el exterior de NavigationSplitView. Peter y yo no tuvimos que hacer ningún cambio de código para obtener la búsqueda alineada en la parte inferior.

    Con la misma ubicación en iPad, nuestra app obtiene la nueva apariencia de búsqueda en la esquina superior final.

    Con la funcionalidad de búsqueda, nunca fue más rápido encontrar lo que estás buscando. Para las apps con pestañas en las que la búsqueda es un destino, la pestaña Buscar ahora aparece separada del resto de las pestañas en la barra y se transforma en el campo de búsqueda. Configura la pestaña como función de búsqueda para obtener la apariencia actualizada. Los controles de todo el sistema también resultan novedosos, como los interruptores, los selectores segmentados y los deslizadores. Nuestras vistas personalizadas tampoco se quedan atrás. También hay API para que puedan aprovechar el nuevo diseño. Aplicamos un efecto de vidrio a nuestra vista personalizada para que refleje perfectamente el contenido que la rodea, como en nuestras fotos anteriores. Estas actualizaciones son solo una muestra de lo que puedes crear con el nuevo diseño. Para obtener más información sobre cómo aprovecharlo, desde las prácticas recomendadas de adopción hasta las personalizaciones avanzadas, consulta la publicación sobre cómo crear una app de SwiftUI con el nuevo diseño. En iPadOS 26, también se presentaron algunas mejoras interesantes en las formas en que los usuarios pueden interactuar con la app. Cuando las personas se deslizan hacia abajo, las apps ahora muestran una barra de menús que proporciona un acceso más rápido a acciones comunes.

    La API de comandos que se usa para crear la barra de menús en macOS ahora crea el mismo resultado en el iPad. Agregué algunos comandos de edición de texto, ya que nuestra app permite a las personas tomar notas para su próximo viaje. Al planificar un viaje, las personas suelen consultar varias apps a la vez. El sistema de ventanas en el iPad se volvió aún más flexible. Las personas pueden ajustar el tamaño de tu app con fluidez.

    En apps como la nuestra, donde se usa la navegación con Split View, el sistema muestra y oculta automáticamente las columnas en función del espacio disponible. Con el fin de preparar tu app para el ajuste de tamaño, migra las API que fijan la pantalla a tamaño completo, como UIRequiresFullscreen. Esta clave de lista de propiedades queda obsoleta en iPadOS 26. Para aprender a diseñar tu app para iPad con ventanas que ajustan el tamaño y la nueva barra de menús, mira el video sobre cómo mejorar el diseño de tu app para el iPad. El ajuste de tamaño de la ventana en macOS también es más fluido. Para los ajustes de tamaño causados por cambios en el tamaño de la vista del contenido, SwiftUI ahora sincroniza la animación entre ese contenido y la ventana. Nuestra app adoptó el nuevo anclaje de ajuste de tamaño de ventana para adaptar el origen de la animación.

    Es ideal para mantener la continuidad entre distintas partes del contenido, como cambiar de pestaña en la vista de configuración. Las mejoras en los bloques de construcción de SwiftUI también hacen que la app sea más potente. Desde un rendimiento superior hasta mejoras en la facilidad de uso y nuevas formas de diseñar el contenido, este es un gran año para crear apps con SwiftUI. Las mejoras en el rendimiento de la estructura benefician a las apps de todas las plataformas de Apple, desde nuestra app hasta la tuya. Hay mejoras importantes que compartir en varias áreas clave. Incluidas listas, desplazamiento y perfiles. Me entusiasman especialmente las mejoras de Lista en macOS. En macOS, las listas de más de 100,000 elementos se cargan ahora seis veces más rápido. Y estas listas se actualizan hasta 16 veces más rápido. Las listas más grandes tienen un rendimiento aún mayor, y hay mejoras para todas las plataformas.

    Esto mejora la experiencia de las personas que usan nuestra app de planificación de viajes, ya sea para ver los viajes, filtrarlos o actualizar los existentes. El desplazamiento también se mejoró.

    Cuando las personas se desplazan en tu app, el sistema otorga a SwiftUI una cierta cantidad de tiempo para renderizar el siguiente cuadro. Si no se termina todo el trabajo en ese plazo, se pierde un cuadro. Nadie quiere esto. Puede hacer que tu app tenga fallos o funcione con lentitud. Ahora, SwiftUI mejora la programación de las actualizaciones de la interfaz de usuario en iOS y macOS. Esto mejora la capacidad de respuesta y permite a SwiftUI trabajar aún más para prepararse para los próximos cuadros. En definitiva, reduce la posibilidad de que tu app pierda un cuadro al desplazarse rápidamente a altas frecuencias de cuadro. Cuando colocas pilas de carga diferida como LazyVStack en este diagrama, dentro de las vistas de desplazamiento, SwiftUI retrasa la carga de las vistas contenidas hasta que están a punto de aparecer. Ahora, los scrollviews anidados con pilas de carga diferida presentan el mismo comportamiento. Esto es ideal para crear vistas como carruseles de fotografías. Para entender qué problemas de rendimiento siguen existiendo en nuestra app, puedo usar el nuevo instrumento de rendimiento de SwiftUI en Xcode. Tiene una variedad de carriles que me permiten inspeccionar rápidamente diferentes áreas problemáticas de rendimiento, como actualizaciones prolongadas del cuerpo de la vista o actualizaciones de la vista de la plataforma. Parece que aún nos queda trabajo por hacer para que nuestra app sea tan rápida como la velocidad a la que Peter puede caminar.

    Para profundizar en el nuevo instrumento, mira el video sobre cómo optimizar el rendimiento de SwiftUI con instrumentos.

    La programación concurrente es otra parte fundamental de la creación de tu app. La compatibilidad de Swift con la concurrencia estructurada permite verificar la seguridad de carrera de datos en el momento de la compilación. Esto nos ayudó a Peter y a mí a encontrar errores en nuestro código concurrente antes de que afectaran a nuestra app. Para obtener más información sobre cómo agregar concurrencia estructurada a la app, consulta el video sobre cómo adoptar la concurrencia en Swift. Continúa con el video sobre el uso de la concurrencia en SwiftUI para descubrir como SwiftUI aprovecha la concurrencia en Swift.

    Mientras nuestra app carga concurrentemente los datos, Peter y yo mostramos una animación. La animación se realiza mediante el protocolo Animatable, en el que definimos una propiedad de datos animable personalizada que anima todas las propiedades de nuestras formas excepto la dirección de dibujo.

    Una vez que agrego esa declaración completa de datos animables, es una gran cantidad de código solo para excluir la dirección de dibujo. Mediante la nueva macro Animatable, puedo eliminar la propiedad de datos animable personalizada y dejar que SwiftUI la sintetice automáticamente por mí. Uso la macro AnimatableIgnored para excluir propiedades que no quiero animar, como la dirección de dibujo. El diseño tiene nuevas dimensiones, tres para ser exactos.

    SwiftUI tiene nuevas variantes basadas en la profundidad de los modificadores que ya conoces, haciendo posible realizar más diseños volumétricos directamente en SwiftUI. En visionOS, nuestra app nos permite planificar las rutas de senderismo. Quiero agregar una funcionalidad que muestre el sol en el cielo en función de dónde estaré de excursión en ese momento. En lugar de una alineación 2D normal, uso el nuevo tipo Alignment3D para alinear el sol. Coloco el sol con el modificador spatialOverlay y ajusto la alineación de la superposición en función de la hora del día.

    Es increíble. Ahora ya no volveré a sufrir quemaduras solares. Esto es solo una pequeña muestra de lo que se puede hacer con las mejoras del diseño espacial de visionOS 26. Consulta el video sobre el diseño espacial de SwiftUI para obtener más información sobre las nuevas herramientas para crear experiencias espaciales. Peter y yo siempre llevamos las mochilas demasiado llenas. Así que agregamos un volumen a nuestra app para ayudarnos a especificar los paquetes. El nuevo modificador manipulable permite interactuar con los objetos de nuestra app. Aquí tomamos el modelo de una botella de agua y permitimos que las personas la tomen y la muevan.

    Para que resulte evidente qué elementos nos quedan por incluir, usamos las nuevas API de ajuste de escenas para leer esta información del entorno.

    A partir de ahí, agregamos un pedestal a los objetos que se colocan a presión en la mesa.

    Con las nuevas API volumétricas es posible crear experiencias realmente especiales. Es increíble.

    SwiftUI tiene muchas más mejoras para ventanas, volúmenes y escenas en visionOS, desde la restauración de ventanas a nuevos tipos de escenas. Aprende a usarlas en la sección sobre cómo preparar la escena con SwiftUI en visionOS. Consulta las novedades de visionOS para conocer todo lo nuevo de la plataforma. Vaya, son unas mejoras de imagen impecables. Parece que esto va a facilitar la preparación de nuestra próxima excursión. Lo sé. Mira esta foto que tomé en mi último viaje.

    Fue un auténtico safari. Se ve genial, Anna. Un buen lugar para ampliar el visor, al igual que SwiftUI este año. Tu app puede aprovechar SwiftUI en todo el sistema. Con las mejoras de la escena y las nuevas API de Widgets y Controles, las apps pueden formar parte de la plataforma más que nunca. Además, SwiftUI funciona aún mejor con otras estructuras. Las escenas son los contenedores principales de las vistas de tu app. Representan partes discretas de la interfaz. Puedes acceder a las escenas mediante una declaración en el cuerpo de la app. Por ejemplo, un WindowGroup. Este año, también puedes solicitar escenas de SwiftUI desde tus apps basadas en el ciclo de vida de UIKit y AppKit con la interconexión de escenas. La interconexión de escenas es realmente genial. Permite a tus apps basadas en el ciclo de vida de UIKit y AppKit interoperar con escenas de SwiftUI. Las apps pueden usarla para abrir tipos de escena exclusivos de SwiftUI o usar funcionalidades exclusivas de SwiftUI directamente desde el código de UIKit o AppKit. Puedes usar tipos de escenas como MenuBarExtra e ImmersiveSpace. También funciona para los modificadores de escenas, como windowStyle y immersiveEnvironmentBehavior. La interconexión de escenas funciona con los nuevos tipos de escena de SwiftUI de este año. Al igual que RemoteImmersiveSpace, en macOS Tahoe y visionOS 26, tu app para Mac puede renderizar contenido estéreo en el Apple Vision Pro usando una nueva escena.

    RemoteImmersiveSpace es una escena de macOS para renderizar contenido estéreo en el Apple Vision Pro. Se renderiza en un RemoteImmersiveSpace con CompositorServices. Tu app para Mac puede usar efectos de desplazamiento y eventos de entrada. Para obtener más información sobre CompositorServices, Metal y su uso con RemoteImmersiveSpace, consulta la sección sobre novedades en el renderizado con Metal para apps envolventes. Y AssistiveAccess, que es un modo especial para usuarios con discapacidades cognitivas. Tu app también puede mostrar la interfaz de usuario cuando alguien tiene su iPhone en este modo adoptando el nuevo tipo de escena AssistiveAccess. Para obtener más información sobre esta API y cómo adoptar AssistiveAccess en tu app en iOS 26, consulta la sección sobre cómo personalizar tu app para el acceso asistido. SwiftUI tiene excelentes mejoras para trabajar con AppKit este año. Además de la interconexión de escenas, puedes mostrar hojas con vistas de SwiftUI en ellas. Esta es una estupenda manera de ir adoptando SwiftUI en tu app. Puedes interconectar tus gestos de AppKit a SwiftUI usando NSGestureRecognizerRepresentable, y puedes usar NSHostingView en Interface Builder. SwiftUI también ofrece más API para trabajar junto a RealityKit con muchísimas mejoras este año. Estas mejoras simplifican cada parte de la interacción con RealityKit desde el código SwiftUI. Las entidades RealityKit ahora se ajustan a Observable, lo que hace que sea fácil observar los cambios en tus vistas de SwiftUI. Se mejoró la API de conversión de coordenadas. Y se mejoró la compatibilidad con las presentaciones directamente desde RealityKit. Usando un nuevo componente, es posible presentar popovers de SwiftUI como este directamente desde una entidad RealityKit. Esto es genial para marcar exactamente dónde queremos ir en nuestra próxima excursión fotográfica. Hay aún más en la integración entre SwiftUI y RealityKit, como componentes adjuntos, sincronización de animaciones, interconexión de componentes y nuevos comportamientos de tamaño para RealityView. Para saber más sobre la amistad entre SwiftUI y RealityKit, consulta “Better Together: SwiftUI & RealityKit". Soy un gran fan de los controles del Centro de Control. Los uso con frecuencia en mi teléfono para controlar mi casa, mi dispositivo con atajos y experiencias con la cámara. Este año, watchOS 26 y macOS Tahoe obtienen controles personalizados. Anna y yo estamos entusiasmados con el uso de los controles en estas plataformas. En la Mac, puedes acceder a los controles personalizados directamente desde el Centro de Control. Y en el reloj, cuando salimos a caminar, podemos marcar nuestros lugares favoritos para tomar fotos con un toque. ¡Impresionante! También soy un gran fan de los widgets. Me gusta obtener información de mis apps al instante. Este año, los widgets llegan a visionOS y CarPlay. En visionOS, podemos personalizar la apariencia de los widgets en el espacio compartido. Agregamos un widget de cuenta regresiva a nuestra app y usamos el nuevo valor de entorno levelOfDetail.

    Cuando nos acercamos al widget, se expande para mostrar algunas fotos que tomamos la última vez que estuvimos allí. Es una forma estupenda de estar al tanto de cuándo volveremos a hacer una excursión fotográfica. ¡Solo faltan 7 días! Hay más novedades para los widgets este año, como Actividades en Vivo en CarPlay, API de actualización por envío activo de datos y nuevas API de relevancia en watchOS. Para obtener más información, consulta la sección sobre novedades en widgets. SwiftUI amplió la capacidad de vistas este año. Desde la edición con texto enriquecido hasta los gráficos en 3D, SwiftUI ofrece nuevas vistas y mejoras de las ya existentes. Para insertar contenido web directamente en tu app, WebKit ahora tiene un conjunto completo de API de SwiftUI, incluida WebView. WebView es una nueva vista de SwiftUI para mostrar contenido web en tu app. Funciona gracias a WebKit, igual que Safari. Tu app puede mostrar direcciones URL inicializando una WebView. Para personalizar e interactuar con la página, las WebViews también pueden mostrar WebPages, un nuevo tipo de modelo observable diseñado desde cero para Swift. WebPage permite una gran interacción con la web. Puede navegar programáticamente por la página y acceder a sus propiedades.

    Hay mucho más en la nueva compatibilidad de WebKit con SwiftUI, como la personalización de agentes de usuario, llamadas a JavaScript, esquemas de URL personalizados y mucho más. Para obtener más información sobre todas estas nuevas API de WebKit, consulta la sección sobre WebKit para SwiftUI. Intentamos convencer a nuestras familias de que nuestras excursiones no tienen tantas colinas. Con la nueva compatibilidad con 3D en los gráficos Swift, podemos mostrarles precisamente eso. Para mostrar gráficos 3D, declaramos un Chart3D. Chart3D muestra gráficos en tres dimensiones. Podemos utilizar los nuevos modificadores específicos de Z para especificar escalas en el espacio 3D. No es de extrañar que estornudara en esa última excursión. ¡Era sinusoidal! Para obtener más información sobre cómo agregar gráficos 3D a tu app, consulta el video sobre cómo llevar los gráficos Swift a la tercera dimensión. Para ayudarnos a compartir los datos del viaje con otras apps, Anna y yo adoptamos la funcionalidad de arrastrar y soltar en nuestra app para Mac. Este año, la funcionalidad de arrastrar y soltar incorpora importantes mejoras para tus apps. Podemos arrastrar varios elementos utilizando la nueva variante del modificador draggable, junto con el nuevo modificador dragContainer. Esto convierte a nuestra vista en un contenedor de elementos de arrastre. Devolvemos los elementos a transferir en función de la selección.

    Esto funciona con el comportamiento de selección personalizado de nuestra app. Cuando usamos este modificador, SwiftUI solicita arrastrar elementos de forma diferida cuando se suelte un elemento.

    Usando la nueva API DragConfiguration, podemos personalizar las operaciones admitidas para arrastrar desde nuestra app. Aquí se permite borrar. Para observar los eventos, usamos el nuevo modificador onDragSessionUpdated. Comprobamos si ha finalizado la fase de borrado antes de eliminar las fotos.

    Ahora, cuando arrastramos a la papelera en el Dock, las fotos se borran.

    Para personalizar el aspecto de las vistas previas de un arrastre, podemos especificar una formación.

    La formación en pila coloca los artículos perfectamente unos encima de otros. ¡Excelente! Además de planificar y compartir nuestros viajes, Anna y yo también queremos que nuestros amigos nos sigan y participen. Estuvimos trabajando para que pudieran comentar nuestras fotos. La nueva compatibilidad de SwiftUI con la edición de texto enriquecido es genial para experiencias como esta.

    TextView ahora es compatible con AttributedString. Si pasamos un enlace a un AttributedString en TextEditor, permitiremos que nuestros amigos comenten nuestras imágenes con texto enriquecido usando los controles de formato de texto incorporados. ¡Impresionante!

    ¿Hueles eso? Huele a texto enriquecido delicioso en SwiftUI. Este año hay un menú de opciones para texto enriquecido y localización. Consulta la sección sobre cómo crear una experiencia de texto enriquecido en SwiftUI con AttributedString para obtener más información. Puedes personalizar los estilos de párrafo, transformar atributos e incluso restringir los atributos que los usuarios pueden usar en tu app. Disfruta del postre con la sección sobre cómo explorar la localización con Xcode y sumérgete en la creación de magníficas experiencias en todos los idiomas. Es muy emocionante ver todos los nuevos lugares para usar SwiftUI. Y muchos puentes hacia otras cosas. Mira esta foto de mi última excursión.

    Deberíamos ir allí la próxima vez. Bueno, es hora de que vayamos a tomar más fotos con nuestras nuevas apps. En tus apps, echa un vistazo al nuevo aspecto con el nuevo diseño, y usa las nuevas API para perfeccionar tu app. Inspecciona el rendimiento de tu app con el nuevo instrumento de rendimiento. Lleva tu app a nuevos niveles con las incorporaciones de volumen y el nuevo diseño espacial. Agrega experiencias más completas a tus apps usando las mejoras de Rich Text y WebKit. Y aprovecha que los controles y widgets están en más sitios que nunca. Esperamos que disfrutes de tus aventuras este año en SwiftUI. Me pregunto si esas mejoras de rendimiento me ayudarán a afrontar las colinas en nuestra próxima excursión. ¿Todo listo para ir? Vamos.

    • 2:27 - Toolbar spacer

      import SwiftUI
      
      struct TripDetailView: View {
          var body: some View {
              NavigationStack {
                  TripList()
                      .toolbar {
                          ToolbarItemGroup(placement: .primaryAction) {
                              UpButton()
                              DownButton()
                          }
      
                          ToolbarSpacer(.fixed, placement: .primaryAction)
      
                          ToolbarItem(placement: .primaryAction) {
                              SettingsButton()
                          }
                      }
              }
          }
      }
      
      struct TripList: View {
          var body: some View {
              Text("TripList")
          }
      }
      
      struct UpButton: View {
          var body: some View {
              Button("Up", systemImage: "chevron.up") { }
          }
      }
      
      struct DownButton: View {
          var body: some View {
              Button("Down", systemImage: "chevron.down") { }
          }
      }
      
      struct SettingsButton: View {
          var body: some View {
              Button("List Settings", systemImage: "ellipsis") { }
          }
      }
    • 2:52 - Toolbar item tint

      import SwiftUI
      
      struct InspectorView: View {
          var body: some View {
              NavigationStack {
                  InspectorMap()
                      .toolbar {
                          ToolbarItem(placement: .primaryAction) {
                              SaveLocationButton()
                                  .buttonStyle(.borderedProminent)
                                  .tint(.pink)
                          }
                      }
              }
          }
      }
      
      struct InspectorMap: View {
          var body: some View {
              Text("InspectorMap")
          }
      }
      
      struct SaveLocationButton: View {
          var body: some View {
              Button("SaveLocationButton") { }
          }
      }
    • 3:30 - Searchable

      import SwiftUI
      
      struct PlannerSplitView: View {
          @State private var query: String = ""
      
          var body: some View {
              NavigationSplitView {
                  Text("Sidebar")
              } detail: {
                  Text("Detail")
              }
              .searchable(
                  text: $query,
                  prompt: "What are you looking for?"
              )
          }
      }
    • 4:12 - Search tab

      import SwiftUI
      
      struct HealthTabView: View {
          @State private var text: String = ""
          
          var body: some View {
              TabView {
                  Tab("Summary", systemImage: "heart") {
                      NavigationStack {
                          Text("Summary")
                      }
                  }
                  Tab("Sharing", systemImage: "person.2") {
                      NavigationStack {
                          Text("Sharing")
                      }
                  }
                  Tab(role: .search) {
                      NavigationStack {
                          Text("Search")
                      }
                  }
              }
              .searchable(text: $text)
          }
      }
    • 4:37 - Glass effect

      import SwiftUI
      
      struct ToTopButton: View {
          var body: some View {
              Button("To Top", systemImage: "chevron.up") {
                  scrollToTop()
              }
              .padding()
              .glassEffect()
          }
      
          func scrollToTop() {
              // Scroll to top of view
          }
      }
    • 5:20 - Menu bar commands

      import SwiftUI
      
      @main
      struct TravelPhotographyApp: App {
          var body: some Scene {
              WindowGroup {
                  RootView()
              }
              .commands {
                  TextEditingCommands()
              }
          }
      }
      
      struct RootView: View {
          var body: some View {
              Text("RootView")
          }
      }
    • 6:40 - Window resize anchor

      import SwiftUI
      
      struct SettingsTabView: View {
          @State private var selection: SectionTab = .general
          var body: some View {
              TabView(selection: $selection.animation()) {
                  Tab("General", systemImage: "gear", value: .general) {
                      Text("General")
                  }
                  Tab("Sections", systemImage: "list.bullet", value: .sections) {
                      Text("Sections")
                  }
              }
              .windowResizeAnchor(.top)
          }
      }
      
      enum SectionTab: Hashable {
          case general
          case sections
      }
    • 11:24 - @Animatable macro

      import SwiftUI
      
      @Animatable
      struct LoadingArc: Shape {
          var center: CGPoint
          var radius: CGFloat
          var startAngle: Angle
          var endAngle: Angle
          @AnimatableIgnored var drawPathClockwise: Bool
      
          func path(in rect: CGRect) -> Path {
              // Creates a `Path` arc using properties
              return Path()
          }
      }
    • 12:15 - Spatial overlay

      import RealityKit
      import SwiftUI
      
      struct Map: View {
          @Binding var timeAlignment: Alignment3D
      
          var body: some View {
              Model3D(named: "Map")
                  .spatialOverlay(
                      alignment: timeAlignment
                  ) {
                      Sun()
                  }
          }
      }
      
      struct Sun: View {
          var body: some View {
              Model3D(named: "Sun")
          }
      }
    • 13:04 - Manipulable and surface snapping

      import ARKit
      import RealityKit
      import SwiftUI
      
      struct BackpackWaterBottle: View {
          @Environment(\.surfaceSnappingInfo) var snappingInfo: SurfaceSnappingInfo
      
          var body: some View {
              VStackLayout().depthAlignment(.center) {
                  waterBottleView
                      .manipulable()
      
                  Pedestal()
                      .opacity(
                          snappingInfo.classification == .table ? 1.0 : 0.0)
              }
          }
      
          var waterBottleView: some View {
              Model3D(named: "waterBottle")
          }
      }
      
      struct WaterBottleView: View {
          var body: some View {
              Model3D(named: "waterBottle")
          }
      }
      
      struct Pedestal: View {
          var body: some View {
              Model3D(named: "pedestal")
          }
      }
    • 15:00 - SwiftUI scenes

      import SwiftUI
      
      @main
      struct PhotoWalk: App {
          var body: some Scene {
              WindowGroup(id: "AppContents") {
                  PhotoWalkContent()
              }
          }
      }
      
      struct PhotoWalkContent: View {
          var body: some View {
              Text("PhotoWalkContent")
          }
      }
    • 16:28 - Assistive Access scene

      import SwiftUI
      
      @main
      struct PhotoWalk: App {
        var body: some Scene {
          WindowGroup {
            ContentView()
          }
      
          AssistiveAccess {
            AssistiveAccessContentView()
          }
        }
      }
      
      struct ContentView: View {
        var body: some View {
          Text("ContentView")
        }
      }
      
      struct AssistiveAccessContentView: View {
        var body: some View {
          Text("AssistiveAccessContentView")
        }
      }
    • 17:52 - SwiftUI presentations from RealityKit

      import RealityKit
      import SwiftUI
      
      struct PopoverComponentView: View {
          @State private var popoverPresented: Bool = false
          var body: some View {
              RealityView { c in
                  let mapEntity = Entity()
      
                  let popover = Entity()
                  mapEntity.addChild(popover)
                  popover.components[PresentationComponent.self] = PresentationComponent(
                      isPresented: $popoverPresented,
                      configuration: .popover(arrowEdge: .bottom),
                      content: DetailsView()
                  )
              }
          }
      }
      
      struct DetailsView: View {
          var body: some View {
              Text("DetailsView")
          }
      }
    • 19:24 - Level of detail

      import SwiftUI
      import WidgetKit
      
      struct PhotoCountdownView: View {
          @Environment(\.levelOfDetail) var levelOfDetail: LevelOfDetail
          var body: some View {
              switch levelOfDetail {
              case .default:
                  RecentPhotosView()
              case .simplified:
                  CountdownView()
              default:
                  Text("Unknown level of detail")
              }
          }
      }
      
      struct RecentPhotosView: View {
          var body: some View {
              Text("RecentPhotosView")
          }
      }
      
      struct CountdownView: View {
          var body: some View {
              Text("CountdownView")
          }
      }
    • 20:28 - WebView

      import SwiftUI
      import WebKit
      
      struct HikeGuideWebView: View {
          var body: some View {
              WebView(url: sunshineMountainURL)
          }
      
          var sunshineMountainURL: URL {
              URL(string: "sunshineMountainURL")!
          }
      }
    • 20:44 - WebView with WebPage

      import SwiftUI
      import WebKit
      
      struct InAppBrowser: View {
          @State private var page = WebPage()
      
          var body: some View {
              WebView(page)
                  .ignoresSafeArea()
                  .onAppear {
                      page.load(URLRequest(url: sunshineMountainURL))
                  }
          }
      
          var sunshineMountainURL: URL {
              URL(string: "sunshineMountainURL")!
          }
      }
    • 21:35 - 3D charts

      import Charts
      import SwiftUI
      
      struct HikePlotView: View {
          var body: some View {
              Chart3D {
                  SurfacePlot(
                      x: "x", y: "y", z: "z") { x, y in
                          sin(x) * cos(y)
                      }
                      .foregroundStyle(Gradient(colors: [.orange, .pink]))
              }
              .chartXScale(domain: -3 ... 3)
              .chartYScale(domain: -3 ... 3)
              .chartZScale(domain: -3 ... 3)
          }
      }
    • 22:18 - macOS drag and drop

      import SwiftUI
      
      struct DragDropExample: View {
          @State private var selectedPhotos: [Photo.ID] = []
          var body: some View {
              ScrollView {
                  LazyVGrid(columns: gridColumns) {
                      ForEach(model.photos) { photo in
                          view(photo: photo)
                              .draggable(containerItemID: photo.id)
                      }
                  }
              }
              .dragContainer(for: Photo.self, selection: selectedPhotos) { draggedIDs in
                  photos(ids: draggedIDs)
              }
              .dragConfiguration(DragConfiguration(allowMove: false, allowDelete: true))
                  .onDragSessionUpdated { session in
                      let ids = session.draggedItemIDs(for: Photo.ID.self)
                          if session.phase == .ended(.delete) {
                              trash(ids)
                              deletePhotos(ids)
                          }
                  }
              .dragPreviewsFormation(.stack)
          }
      }
    • 23:55 - Rich text view

      import SwiftUI
      
      struct CommentEditor: View {
          @Binding var commentText: AttributedString
      
          var body: some View {
              TextEditor(text: $commentText)
          }
      }
    • 0:00 - Introducción
    • Anna y Peter presentan la sesión, destacando las principales mejoras en SwiftUI que van desde el rendimiento hasta los elementos de la IU. Mencionan una app de senderismo que crearon para mostrar estas mejoras. Hablarán de las nuevas funcionalidades del sistema, rendimiento, animaciones, diseño, nuevas plataformas para SwiftUI, soporte de contenido web y texto enriquecido.

    • 1:22 - Haz que el nuevo diseño brille
    • Esta sección se centra en el nuevo sistema de diseño y cómo afecta la apariencia de las apps. Se explican los contenedores de navegación, las barras de pestañas y las apariencias de las barras de herramientas. También incluye mejoras en la búsqueda y los controles. La sección concluye con mejoras en las interacciones del iPad, incluida una nueva barra de menú y un cambio de tamaño de ventana flexible, y un cambio de tamaño de ventana mejorado en macOS. API Presentadas/Destacadas: API Toolbar Spacer: se usa para ajustar las secciones de los elementos de la barra de herramientas. Tinte de Liquid Glass en las barras de herramientas: permite elementos de la barra de herramientas más destacados mediante estilos de botones destacados con borde y un color de tinte. Efecto de borde de desplazamiento: aplica un efecto de desenfoque al contenido de la barra de herramientas al desplazarse. Funciones de búsqueda en las barras de pestañas: permite que la pestaña de búsqueda aparezca separada del resto de las pestañas en la barra. Comandos de API: se usa para crear la barra de menús en macOS y ahora crea el mismo resultado en el iPad. Anclaje de cambio de tamaño de ventana: se usa para personalizar el origen de la animación de cambio de tamaño de la ventana. Deprecación de UIRequiresFullscreen: la clave del archivo de propiedades está obsoleta en iPadOS 26.

    • 6:59 - Bases del marco
    • Esta sección abarca las mejoras en los componentes básicos de SwiftUI, incluido el rendimiento, la facilidad de uso y el diseño. Se detallan las mejoras de rendimiento en listas y desplazamiento, y se presenta el nuevo instrumento de rendimiento SwiftUI en Xcode. También se habla de la macro Animatable y las nuevas API para diseño volumétrico, incluidas aquellas para visionOS. API Presentadas/Destacadas: Instrumento de rendimiento de SwiftUI (Xcode): una nueva herramienta para inspeccionar áreas problemáticas de rendimiento. Macro Animatable: simplifica el uso del protocolo Animatable al sintetizar automáticamente la propiedad de datos animables. Macro AnimatableIgnored: excluye propiedades de la animación cuando se usa la macro Animatable. Alignment3D: un nuevo tipo para alinear vistas en el espacio 3D. Modificador de superposición espacial: se usa para colocar vistas en el espacio 3D. Modificador manipulable: permite a los usuarios interactuar con objetos en la app. API Scene Snapping: se usa para leer información del entorno.

    • 14:33 - SwiftUI en el sistema
    • Esta sección se centra en ampliar el alcance de SwiftUI en diferentes plataformas de Apple. Trata sobre la vinculación de escenas, que permite que las apps de UIKit y AppKit interoperen con escenas de SwiftUI. Incluye la escena RemoteImmersiveSpace para renderizar contenido estéreo en el Apple Vision Pro desde macOS. También menciona el tipo de escena AssistiveAccess para un modo especial para usuarios con discapacidades cognitivas. La sección también incluye las mejoras en el trabajo con AppKit, RealityKit, Controles y Widgets. API Presentadas/Destacadas: Scene Bridging: permite que las apps de UIKit y AppKit usen escenas SwiftUI. Escena MenuBarExtra: un nuevo tipo de escena. Escena ImmersiveSpace: un nuevo tipo de escena. Escena RemoteImmersiveSpace: una escena de macOS para renderizar contenido estéreo en el Apple Vision Pro. Escena AssistiveAccess: un tipo de escena para mostrar la IU cuando alguien tiene el iPhone en modo en Assistive Access. NSGestureRecognizerRepresentable: se usa para conectar los gestos de AppKit con SwiftUI. Observable Conformance para entidades de RealityKit: facilita la observación de cambios en las entidades RealityKit desde las vistas de SwiftUI. Valor del entorno LevelOfDetail: se usa para personalizar la apariencia de los widgets según la proximidad.

    • 20:04 - Expandir las vistas de SwiftUI
    • Esta sección destaca las nuevas capacidades de las vistas de SwiftUI. Incluye el nuevo WebView para integrar contenido web, mejoras en Swift Charts para gráficos 3D, mejoras en Arrastrar y soltar, y nuevo soporte para edición de texto enriquecido usando AttributedString en TextView. API Presentadas/Destacadas: WebView: una nueva vista de SwiftUI para mostrar contenido web en tu app. WebPage: un nuevo tipo de modelo observable diseñado para Swift para permitir una interacción enriquecida con el contenido web. Chart3D: se usa para mostrar gráficos en tres dimensiones. Modificadores específicos del eje Z (Swift Charts): se usan para especificar escalas en el espacio 3D. Modificador de arrastre (varios elementos): Permite arrastrar varios elementos. Modificador DragContainer: Convierte una vista en un contenedor para elementos arrastrables. API DragConfiguration: se usa para personalizar las operaciones admitidas para arrastres. Modificador OnDragSessionUpdated: se usa para observar eventos de arrastre. TextView con AttributedString: permite la edición de texto enriquecido en SwiftUI.

    • 25:01 - Próximos pasos
    • Los presentadores resumen las conclusiones clave de la sesión y alientan a los desarrolladores a explorar las nuevas funcionalidades y API. Destacan el nuevo diseño, el instrumento de rendimiento, la disposición volumétrica, las mejoras en texto enriquecido y el soporte ampliado para controles y widgets en distintas plataformas.

Developer Footer

  • Videos
  • WWDC25
  • Novedades de SwiftUI
  • Open Menu Close Menu
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • Icon Composer
    • SF Symbols
    Open Menu Close Menu
    • Accessibility
    • Accessories
    • App Store
    • Audio & Video
    • Augmented Reality
    • Business
    • Design
    • Distribution
    • Education
    • Fonts
    • Games
    • Health & Fitness
    • In-App Purchase
    • Localization
    • Maps & Location
    • Machine Learning & AI
    • Open Source
    • Security
    • Safari & Web
    Open Menu Close Menu
    • Documentation
    • Sample Code
    • Tutorials
    • Downloads
    • Forums
    • Videos
    Open Menu Close Menu
    • Support Articles
    • Contact Us
    • 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
    • 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
    Get the Apple Developer app.
    Copyright © 2025 Apple Inc. All rights reserved.
    Terms of Use Privacy Policy Agreements and Guidelines