-
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
- Applying Liquid Glass to custom views
- Populating SwiftUI menus with adaptive controls
- Adopting Liquid Glass
- Human Interface Guidelines
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…
-
-
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.