-
Nouveautés dans SwiftUI
Découvrez les nouveautés apportées à SwiftUI pour créer des apps de qualité sur toutes les plates-formes Apple. Nous verrons comment offrir à votre app une toute nouvelle apparence et expérience avec Liquid Glass. Apprenez à optimiser les performances grâce aux améliorations de framework et aux nouveaux instruments, et à intégrer des fonctionnalités avancées comme le contenu web et l'édition de texte enrichi. Nous vous montrerons également comment SwiftUI s'étend à de nouveaux espaces, en permettant notamment la disposition des vues en trois dimensions.
Chapitres
- 0:00 - Introduction
- 1:22 - Sublimer le nouveau design
- 6:59 - Fondements des frameworks
- 14:33 - SwiftUI à travers tout le système
- 20:04 - Développer les vues SwiftUI
- 25:01 - Étapes suivantes
Ressources
- Applying Liquid Glass to custom views
- Populating SwiftUI menus with adaptive controls
- Adopting Liquid Glass
- Human Interface Guidelines
Vidéos connexes
WWDC25
- Adoptez la concurrence avec Swift
- Code-along : explorez la localisation avec Xcode
- Code-along : Préparation d’une expérience de texte enrichie dans SwiftUI avec AttributedString
- Créez une app SwiftUI avec le nouveau design
- Découvrez la disposition spatiale SwiftUI
- Découvrez WebKit pour SwiftUI
- Découvrir la simultanéité dans SwiftUI
- Donnez une nouvelle dimension à Swift Charts avec la 3D
- Mieux ensemble : SwiftUI et RealityKit
- Nouveautés dans les widgets
- Nouveautés du rendu Metal pour les apps immersives
- Optimiser les performances de SwiftUI avec Instruments
- Personnalisez votre app pour Accès d’aide
- Plantez le décor avec SwiftUI dans visionOS
- Quoi de neuf dans visionOS 26
- Sublimez le design de votre app iPad
-
Rechercher dans cette vidéo…
-
-
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 - Introduction
Anna et Peter présentent la séance en soulignant les principales améliorations apportées à SwiftUI, allant des performances aux éléments de l’interface utilisateur. Ils mentionnent une app de randonnée qu’ils ont créée pour mettre en valeur ces améliorations. Ils aborderont les nouvelles fonctionnalités du système, les performances, les animations, la disposition, les nouvelles plateformes pour SwiftUI, la prise en charge du contenu web et le texte enrichi.
- 1:22 - Sublimer le nouveau design
Cette section se concentre sur le nouveau système de conception et son impact sur l’apparence et la convivialité des apps. Elle traite de la mise à jour des conteneurs de navigation, des barres d’onglets et de l’apparence des barres d’outils. Elle aborde également les améliorations apportées à la recherche et aux contrôles. La section se termine par les améliorations apportées aux interactions sur iPad, notamment une nouvelle barre de menus et un redimensionnement flexible des fenêtres, ainsi que l’amélioration du redimensionnement des fenêtres sur macOS. API présentées/mises en avant : API Toolbar Spacer : permet d’ajuster les sections des éléments de la barre d’outils. Teinte de Liquid Glass dans les barres d’outils : permet de mettre davantage en évidence les éléments de la barre d’outils grâce à des boutons bien visibles, encadrés et dotés d’une teinte spécifique. Effet de bord de défilement : applique un effet de flou au contenu de la barre d’outils lors du défilement. Rechercher des rôles dans les barres d’onglets : permet d’afficher l’onglet de recherche séparément des autres onglets dans la barre d’onglets. API Commands : permet de créer la barre de menu sur macOS et produit désormais le même résultat sur iPad. Window Resize Anchor : permet de personnaliser l’origine de l’animation de redimensionnement de la fenêtre. Dépréciation d’UIRequiresFullscreen : cette clé de liste de propriétés est obsolète dans iPadOS 26.
- 6:59 - Fondements des frameworks
Cette section traite des améliorations apportées aux composants de base de SwiftUI, notamment en termes de performances, de facilité d’utilisation et de disposition. Elle décrit en détail les gains de performances obtenus au niveau des listes et du défilement, et présente le nouvel instrument de performances SwiftUI dans Xcode. Elle aborde également la macro Animatable et les nouvelles API pour la disposition volumétrique, y compris celles pour visionOS. API présentées/mises en avant : Instrument de performance SwiftUI (Xcode) : un nouvel outil pour inspecter les problèmes de performance. Macro Animatable : simplifie l’utilisation du protocole Animatable en synthétisant automatiquement la propriété de données Animatable. Macro AnimatableIgnored : exclut les propriétés de l’animation lors de l’utilisation de la macro Animatable. Alignment3D : un nouveau type d’alignement de vues dans l’espace 3D. Modificateur Spatial Overlay : permet de placer des vues dans l’espace 3D. Modificateur Manipulable : permet aux utilisateurs d’interagir avec les objets de l’app. API Scene Snapping : permet de lire des informations en dehors de l’environnement.
- 14:33 - SwiftUI à travers tout le système
Cette section se concentre sur l’extension des fonctionnalités de SwiftUI à différentes plateformes Apple. Elle aborde le Scene Bridging, qui permet aux apps UIKit et AppKit d’interagir avec les scènes SwiftUI. Elle couvre la scène RemoteImmersiveSpace pour le rendu de contenu stéréo sur Apple Vision Pro à partir de macOS. Elle mentionne également le type de scène AssistiveAccess pour le mode spécial destiné aux utilisateurs souffrant de troubles cognitifs. Cette section couvre également les améliorations apportées à l’utilisation d’AppKit, de RealityKit, des contrôles et des widgets. API présentées/mises en avant : Scene Bridging : permet aux apps UIKit et AppKit d’utiliser les scènes SwiftUI. MenuBarExtra Scene : un nouveau type de scène. ImmersiveSpace Scene : un nouveau type de scène. RemoteImmersiveSpace Scene : scène macOS permettant le rendu de contenu stéréo sur l’Apple Vision Pro. AssistiveAccess Scene : type de scène permettant d’afficher l’interface utilisateur lorsqu’une personne a son iPhone en mode Accès d’aide. NSGestureRecognizerRepresentable : permet de relier les gestes d’AppKit à SwiftUI. Observable Conformance pour les entités RealityKit : permet d’observer plus facilement les changements dans les entités RealityKit à partir des vues SwiftUI. LevelOfDetail Environment Value : permet de personnaliser l’apparence des widgets en fonction de leur proximité.
- 20:04 - Développer les vues SwiftUI
Cette section met en avant les capacités étendues des vues SwiftUI. Elle couvre la nouvelle vue WebView pour l’intégration de contenu web, les améliorations apportées à Swift Charts pour la création de graphiques 3D, les améliorations apportées au glisser-déposer et la nouvelle prise en charge de l’édition de texte enrichi à l’aide d’AttributedString dans TextView. API présentées/mises en avant : WebView : nouvelle vue SwiftUI qui permet d’afficher du contenu web dans votre app. WebPage : nouveau type de modèle observable conçu pour Swift afin de permettre une interaction avancée avec le contenu web. Chart3D : permet d’afficher des graphiques en trois dimensions. Modificateurs spécifiques à Z (graphiques Swift) : permettent de spécifier des échelles dans l’espace 3D. Modificateur Draggable (éléments multiples) : permet de faire glisser plusieurs éléments. Modificateur DragContainer : transforme une vue en conteneur pour les éléments à faire glisser. API DragConfiguration : permet de personnaliser les opérations prises en charge pour les glissements. Modificateur OnDragSessionUpdated : permet d’observer les évènements de glisser-déposer. TextView avec AttributedString : permet la modification de texte enrichi dans SwiftUI.
- 25:01 - Étapes suivantes
Les présentateurs résument les points clés de la séance et encouragent les développeurs à explorer les nouvelles fonctionnalités et API. Ils mettent en avant la nouvelle conception, l’instrument de performance, la disposition volumétrique, les améliorations apportées au texte enrichi et la prise en charge étendue de la plateforme pour les contrôles et les widgets.