
-
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
- Adopting Liquid Glass
- Applying Liquid Glass to custom views
- Human Interface Guidelines
- Populating SwiftUI menus with adaptive controls
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…
Bonjour, je m’appelle Anna. Et je m’appelle Peter. Nous sommes des ingénieurs de l’équipe SwiftUI. Nous sommes impatients de vous parler des nouveautés de SwiftUI. Des améliorations de performances de base jusqu’aux boutons de votre UI, plusieurs optimisations majeures ont été apportées à l’ensemble du système. Il est plus facile d’interagir avec du texte et du contenu web, et SwiftUI est encore plus accessible. L’une de mes plus grandes passions et de celle d’Anna, juste après SwiftUI, est de prendre des photos en randonnée. Peter et moi avons créé une app pour nous aider à planifier et à partager nos randonnées. Elle utilise les améliorations apportées à SwiftUI pour offrir un aspect et une convivialité remarquables. Je vais d’abord vous présenter l’ensemble des nouvelles fonctionnalités du système. Je vais vous présenter les améliorations apportées aux performances, aux animations et à la disposition. Peter vous fera découvrir les nouveaux emplacements où vous pouvez utiliser SwiftUI sur toutes les plate-formes Apple. Il vous présentera les fonctionnalités étendues des vues SwiftUI, notamment la prise en charge du contenu web et du texte enrichi. Découvrons comment vous pouvez mettre en valeur votre app grâce à un nouveau design. Le nouveau système offre une expérience claire et fluide, cohérente sur toutes les plates-formes Apple.
Une fois notre app recompilée, celle-ci affiche un tout nouveau design. La structure de notre app n’a pas changé, mais les conteneurs de navigation ont été adaptés au nouveau design.
Sur l’iPad et sur macOS, la barre latérale de notre app a un aspect vitreux qui reflète le contenu qui l’entoure. Les barres d’onglets ont été mises à jour. Sur l’iPhone, elles ont une nouvelle apparence, plus compacte.
Outre les barres d’onglets, la plupart des éléments de la barre d’outils apparaissent en Liquid Glass. Lors des transitions de navigation, ces éléments peuvent même changer de forme. Comme ceci.
Notre app utilise la nouvelle API d’espacement de la barre d’outils pour ajuster les sections des éléments de la barre d’outils. Nous utilisons une espace fixe pour séparer les boutons haut et bas du bouton des réglages.
Pour rendre les éléments de la barre d’outils plus visibles, Liquid Glass prend en charge la coloration.
Peter et moi appliquons un style de bouton en relief avec une bordure et une couleur teintée pour obtenir cet effet. Lorsque les utilisateurs font défiler l’interface de notre app, la barre d’outils floute désormais le contenu de la barre situé sur le bord qui défile. Cet effet de défilement garantit que le contenu de notre barre reste lisible, quel que soit l’élément qui se trouve en dessous.
Pour trouver des excursions, les utilisateurs font souvent une recherche. Cette fonction se trouve désormais en bas sur l’iPhone, ce qui la rend plus ergonomique. Notre code existant place le modificateur searchable à l’extérieur de NavigationSplitView. Nous n’avons pas eu à modifier le code pour que la recherche s’affiche en bas de l’écran.
Sur l’iPad, notre app affiche la nouvelle case de recherche dans le coin supérieur droit.
Grâce à la fonction searchable, vous trouverez plus rapidement ce que vous recherchez. Pour les apps à onglets, l’onglet Recherche apparaît désormais séparé du reste des onglets dans la barre d’onglets et se transforme en champ de recherche. Définissez votre onglet avec un rôle de recherche pour obtenir l’apparence mise à jour. Les commandes du système offrent une nouvelle expérience, comme les bascules, les sélecteurs segmentés et les curseurs. Nos vues personnalisées ne sont pas en reste non plus. Des API leur permettent de tirer parti du nouveau design. Nous appliquons un effet de verre à notre vue personnalisée, afin qu’elle reflète le contenu qui l’entoure, comme nos photos. Ces mises à jour ne sont qu’un aperçu de ce que vous pouvez créer avec le nouveau design. Pour obtenir plus d’infos sur les meilleures pratiques d’adoption ou les personnalisations avancées, regardez « Build a SwiftUI app with the new design ». Dans iPadOS 26, des améliorations ont également été apportées à la manière dont les utilisateurs peuvent interagir avec votre app. Si les utilisateurs font défiler vers le bas, les apps affichent une barre de menu pour accéder rapidement aux actions courantes.
L’API de commandes utilisée pour créer la barre de menus sur macOS produit le même résultat sur iPad. J’ai ajouté des commandes d’édition de texte, car notre app permet de prendre des notes pour leur prochaine excursion. Lorsqu’ils planifient une excursion, les utilisateurs consultent souvent plusieurs apps simultanément. Le fenêtrage sur iPad est désormais encore plus flexible. Votre app peut être redimensionnée facilement.
Pour les apps qui utilisent Split View, le système affiche et masque automatiquement les colonnes en fonction de l’espace disponible. Pour faciliter le redimensionnement de votre app, supprimez les API qui imposent le plein écran, comme UIRequiresFullscreen. Cette clé de liste de propriétés est obsolète dans iPadOS 26. Pour plus d’infos sur les fenêtres redimensionnable sur iPad et la nouvelle barre de menus, regardez « Elevate the design of your iPad app ». Le redimensionnement des fenêtres sous macOS est aussi plus fluide. Pour les redimensionnements causés par des changements dans la taille de la vue du contenu, SwiftUI synchronise l’animation entre ce contenu et la fenêtre. Notre app a adopté le nouvel ancrage de redimensionnement de la fenêtre afin d’adapter l’origine de l’animation.
Cette fonction est utile pour assurer la continuité entre différentes parties du contenu, comme le fait de changer d’onglet dans notre vue des réglages. Les améliorations apportées aux composants de SwiftUI rendent notre app plus performante. Entre les gains de performances et d’ergonomie et les nouvelles approches pour présenter votre contenu, c’est une année idéale pour développer des apps avec SwiftUI. Les améliorations du framework bénéficient à toutes les apps sur les plates-formes Apple, qu’il s’agisse des nôtres ou de la vôtre. Plusieurs domaines clés bénéficient d’optimisations majeures. Par exemple, les listes, le défilement et le profilage. Je suis impressionnée par les améliorations des listes sur macOS. Sous macOS, les listes de plus de 100 000 éléments se chargent 6 fois plus rapidement. Elles sont mises à jour jusqu’à 16 fois plus vite. Les listes plus longues bénéficient de gains supplémentaires, et des améliorations ont été apportées à toutes les plates-formes.
Cela améliore l’expérience des utilisateurs de notre app de randonnées, qu’ils visualisent leurs itinéraires, les filtrent ou les mettent à jour. Le défilement n’est pas en reste non plus.
Lorsque les utilisateurs font défiler votre app, le système accorde du temps à SwiftUI pour afficher l’image suivante. Si le traitement n’est pas effectué dans ce délai, cela entraîne une perte d’image, ce qui est à éviter absolument. Cela peut entraîner des bugs ou un ralentissement de votre app. SwiftUI a amélioré la planification des mises à jour de l’interface utilisateur sur iOS et macOS. Cela améliore la réactivité et permet à SwiftUI d’effectuer encore plus de tâches pour préparer les images à venir. Cela réduit le risque de perte d’une image lors d’un défilement rapide à des fréquences d’images élevées. Lorsque vous placez des Lazy Stacks, comme la LazyVStack dans ce diagramme, dans un conteneur ScrollView, SwiftUI retarde le chargement des vues jusqu’à ce qu’elles soient sur le point de s’afficher. Désormais, les ScrollViews imbriqués avec des Lazy Stacks ont le même comportement. C’est idéal pour créer des vues comme des carrousels de photos. Pour comprendre les problèmes de performance dans notre app, je peux utiliser le nouvel instrument de performance SwiftUI dans Xcode. Il intègre des options qui me permettent d’inspecter différentes zones présentant des soucis de performances, comme les mises à jour longues de la vue du corps ou les mises à jour de la vue de la plate-forme. Il semble que nous ayons encore du travail à faire pour rendre notre app aussi rapide que Peter quand il est en randonnée.
Pour en savoir plus sur ce nouvel instrument, regardez « Optimize SwiftUI performance with Instruments ».
La programmation concurrente est un autre élément fondamental de la création d’une app. La prise en charge par Swift de la concurrence structurée permet de vérifier la sécurité des données lors de la compilation. Nous avons ainsi pu détecter des erreurs dans notre code concurrent avant qu’elles n’affectent notre app. Pour en savoir plus sur l’ajout d’une concurrence structurée à votre app, regardez « Embracing Swift concurrency ». Puis, visionnez « Explore concurrency in SwiftUI » pour savoir comment SwiftUI tire parti de la concurrence dans Swift.
Pendant que notre app charge ses données, Peter et moi affichons une animation. Nous exécutons cette animation à l’aide du protocole Animatable. Nous définissons une propriété animatableData personnalisée qui anime toutes nos propriétés de formes, à l’exception de la direction du dessin.
Lorsque j’ajoute cette déclaration animatableData, j’ai beaucoup de code juste pour exclure la direction du dessin. Grâce à la nouvelle macro Animatable, je peux supprimer la propriété animatableData et laisser SwiftUI la synthétiser automatiquement pour moi. J’utilise la macro AnimatableIgnored pour exclure les propriétés que je ne veux pas animer, comme la direction du dessin. La disposition se fait dans trois dimensions pour être exact.
SwiftUI propose de nouvelles variantes de modificateurs basées sur la profondeur, ce qui vous permet d’effectuer une disposition plus volumétrique directement dans SwiftUI. Dans visionOS, notre app nous permet de planifier nos randonnées. J’aimerais ajouter une fonctionnalité qui affiche la position du soleil dans le ciel en fonction de l’endroit où je me trouve à ce moment-là. Au lieu d’un alignement 2D normal, j’utilise le nouveau type Alignment3D pour aligner le soleil. Je place le soleil avec spatialOverlay et j’ajuste l’alignement de la superposition en fonction de l’heure de la journée.
C’est génial. Je n’aurai jamais plus de coups de soleil. Ce n’est qu’un aperçu des améliorations apportées à la disposition spatiale dans visionOS 26. Regardez « Meet SwiftUI spatial layout » pour en savoir plus sur les nouveaux outils de création d’expériences spatiales. Peter et moi avons toujours des sacs à dos surchargés. Nous avons ajouté un volume à notre app pour définir les spécifications de nos sacs. Le nouveau modificateur manipulable permet aux utilisateurs d’interagir avec les objets de notre app. Prenons l’exemple d’une bouteille d’eau que les utilisateurs peuvent prendre et déplacer.
Pour savoir quels éléments nous devons encore emballer, nous utilisons les nouvelles API de capture de scène pour lire ces informations dans l’environnement.
À partir de là, nous ajoutons un socle aux éléments qui sont alignés sur la table.
Grâce aux nouvelles API volumétriques, vous pouvez créer des expériences exceptionnelles. C’est génial.
SwiftUI apporte des améliorations aux fenêtres, aux volumes et aux scènes sur visionOS, de la restauration des fenêtres aux nouveaux types de scènes. Apprenez à les utiliser dans « Set the scene with SwiftUI in visionOS ». Regardez « What’s new in visionOS » pour découvrir les nouveautés de la plate-forme. Ces améliorations sont vraiment remarquables à l’écran. J’ai l’impression que tout ceci va grandement faciliter notre prochaine randonnée photo. C’est bien vrai. Regarde cette photo de mon dernier voyage.
C’était un véritable safari. C’est vraiment super, Anna. Un cadre idéal pour élargir ses horizons, comme SwiftUI cette année. Votre app peut tirer parti de SwiftUI sur l’ensemble du système. Grâce aux améliorations apportées à la scène et aux nouvelles API dans les widgets et les commandes, les apps peuvent être plus intégrées que jamais à la plate-forme. Et SwiftUI fonctionne encore mieux avec d’autres frameworks. Les scènes sont les conteneurs racines des vues de votre app. Elles représentent des parties distinctes de votre interface. Vous pouvez accéder aux scènes en les déclarant dans le code de votre app. Par exemple, un WindowGroup. Vous pouvez demander des scènes SwiftUI à partir de vos apps de cycle de vie UIKit et AppKit grâce au Scene Bridging. Le Scene Bridging est vraiment cool. Il permet à vos apps de cycle de vie UIKit et AppKit d’interagir avec les scènes SwiftUI. Les apps peuvent l’utiliser pour ouvrir des types de scènes réservés à SwiftUI ou utiliser des fonctionnalités exclusives à SwiftUI directement à partir du code UIKit ou AppKit. Vous pouvez utiliser des types de scènes comme MenuBarExtra et ImmersiveSpace. Il fonctionne pour les modificateurs de scène, comme windowStyle et immersiveEnvironmentBehavior. Le Scene Bridging fonctionne avec les nouveaux types de scènes ajoutés à SwiftUI. Comme RemoteImmersiveSpace, dans macOS Tahoe et visionOS 26, votre app Mac peut effectuer le rendu d’un contenu stéréo sur Apple Vision Pro à l’aide d’une nouvelle scène.
RemoteImmersiveSpace est une scène macOS pour le rendu de contenu stéréo sur Apple Vision Pro. Vous effectuez le rendu dans un RemoteImmersiveSpace avec CompositorServices. Votre app Mac peut utiliser des effets de survol et des événements de saisie. Pour en savoir plus sur CompositorServices, Metal et leur utilisation avec RemoteImmersiveSpace, regardez « What’s new in Metal rendering for immersive apps ». Accès d’aide est un mode spécial pour les personnes présentant des déficiences cognitives. Votre app peut aussi afficher l’interface utilisateur lorsque l’iPhone est dans ce mode en adoptant le nouveau type de scène AssistiveAccess. Pour en savoir plus sur cette API et sur la manière d’intégrer AssistiveAccess dans votre app sous iOS 26, regardez « Customize your app for Assistive Access ». SwiftUI intègre d’importantes améliorations pour la collaboration avec AppKit. En plus du Scene Bridging, vous pouvez afficher des feuilles contenant des vues SwiftUI. C’est un excellent moyen d’adopter progressivement SwiftUI dans votre app. Vous pouvez relier vos gestes AppKit à SwiftUI en utilisant NSGestureRecognizerRepresentable. Vous pouvez aussi utiliser NSHostingView dans Interface Builder. SwiftUI propose aussi plus d’API pour RealityKit avec de nombreuses améliorations cette année. Ces améliorations simplifient tous les aspects de l’interaction avec RealityKit à partir de votre code SwiftUI. Les entités RealityKit sont désormais conformes à Observable, ce qui facilite l’observation des changements dans vos vues SwiftUI. L’API de conversion des coordonnées a été améliorée. La prise en charge des présentations directement depuis RealityKit a été optimisée. Grâce à un nouveau composant, vous pouvez afficher des fenêtres contextuelles SwiftUI directement à partir d’une entité RealityKit. C’est très utile pour marquer exactement l’endroit où nous voulons aller. L’intégration entre SwiftUI et RealityKit est encore plus avancée, comme l’attachement de composants, la synchronisation d’animations, la liaison à des composants et de nouveaux comportements de dimensionnement pour RealityView. Pour en savoir plus sur la collaboration continue entre SwiftUI et RealityKit, regardez « Better Together: SwiftUI & RealityKit ». Je suis fan des commandes du centre de contrôle. Je les utilise souvent sur mon téléphone pour contrôler ma maison, mon appareil via des raccourcis et l’appareil photo. watchOS 26 et macOS Tahoe intègrent des commandes personnalisées. Anna et moi avons hâte d’utiliser des commandes sur ces plates-formes. Sur Mac, vous pouvez accéder aux commandes personnalisées à partir du centre de contrôle. Et sur une Watch, nous pouvons marquer d’un simple geste nos endroits préférés pour prendre des photos. Génial ! J’adore aussi les widgets. J’aime obtenir des informations de mes apps en un seul coup d’œil. Cette année, les widgets arrivent sur visionOS et CarPlay. Sur visionOS, nous pouvons personnaliser l’apparence des widgets dans le Shared Space. Nous avons ajouté un widget de compte à rebours à notre app et utilisé la nouvelle valeur d’environnement levelOfDetail.
Lorsque nous nous approchons du widget, celui-ci s’agrandit pour afficher des photos de notre dernière randonnée. C’est idéal pour surveiller la date de notre prochaine randonnée photo. Plus que 7 jours ! Les widgets intègrent de nombreuses nouveautés, comme les activités en temps réel sur CarPlay, l’API de mise à jour par push et de nouvelles API pour améliorer la pertinence sur watchOS. Pour en savoir plus, regardez « What’s new in widgets ». Cette année, SwiftUI a élargi les possibilités d’affichage. De l’édition de texte avancée à la création de graphiques en 3D, SwiftUI propose de nouveaux affichages et des améliorations pour les affichages existants. Pour intégrer du contenu web directement dans votre app, WebKit intègre désormais un ensemble complet d’API SwiftUI, dont WebView. WebView est une nouvelle vue SwiftUI qui permet d’afficher du contenu web dans votre app. Elle est optimisée par WebKit, tout comme Safari. Votre app peut afficher des URL en initialisant une WebView. Pour personnaliser la page et interagir avec celle-ci, les WebViews peuvent également afficher des WebPages, un nouveau type de modèle observable entièrement conçu pour Swift. WebPage permet une interaction avancée avec le Web. Vous pouvez naviguer par programmation sur la page et accéder aux propriétés de la page.
La nouvelle prise en charge de SwiftUI par WebKit inclut la personnalisation des agents utilisateurs, l’appel de JavaScript, les schémas d’URL personnalisés, etc. Pour en savoir plus sur toutes ces nouvelles API WebKit, regardez « Meet WebKit for SwiftUI ». Nous essayons de convaincre nos familles que nos randonnées ne sont pas si difficiles. Avec la prise en charge de la 3D dans les graphiques Swift, nous pouvons leur montrer que c’est vrai. Pour afficher des graphiques en 3D, nous créons une fonction Chart3D. Chart3D affiche des graphiques en trois dimensions. Nous pouvons utiliser les nouveaux modificateurs spécifiques à Z pour spécifier les échelles dans l’espace 3D. Je n’ai pas arrêté d’éternuer lors de ma dernière randonnée. Pas étonnant, car c’était sinusoïdal ! Pour en savoir plus sur l’ajout de graphiques 3D à votre app, regardez la vidéo « Bring Swift Charts to the third dimension ». Pour partager nos données de randonnée avec d’autres apps, Anna et moi avons adopté le glisser-déposer dans notre app Mac. Le glisser-déposer a fait l’objet d’améliorations majeures pour vos apps. Nous pouvons faire glisser plusieurs éléments en utilisant la nouvelle variante du modificateur draggable, ainsi que le nouveau modificateur dragContainer. Notre vue devient ainsi un conteneur pour les éléments à faire glisser. Nous renvoyons les éléments pour qu’ils soient transférés en fonction de la sélection.
Cela fonctionne avec le comportement de sélection personnalisé dans notre app. Lorsque nous utilisons ce modificateur, les requêtes SwiftUI ne font pas glisser les éléments immédiatement lors d’un dépôt.
Grâce à la nouvelle API DragConfiguration, nous personnalisons les opérations prises en charge pour les glissements à partir de notre app. Ici, nous autorisons la suppression. Pour observer les évènements, nous utilisons le nouveau modificateur onDragSessionUpdated. Nous vérifions que la phase de suppression est terminée avant de supprimer les photos.
Lorsque nous les faisons glisser vers la corbeille dans le Dock, les photos sont supprimées.
Pour personnaliser l’apparence des aperçus lors d’un glissement, nous pouvons spécifier une formation.
La formation en pile permet de placer les éléments les uns sur les autres. Excellent ! Anna et moi voulons aussi que nos amis puissent suivre nos aventures et y participer. Nous avons développé un outil pour qu’ils puissent commenter nos photos. La prise en charge de l’édition de texte avancée par SwiftUI est idéale pour ce type d’expérience.
TextView prend désormais en charge AttributedString ! En transmettant une liaison à un AttributedString dans TextEditor, nous permettons à nos amis de commenter nos images avec du texte enrichi à l’aide des commandes de formatage de texte intégrées. Génial !
Vous sentez ça ? Ça sent bon le texte enrichi dans SwiftUI. Vous avez un menu d’options pour le texte enrichi et la localisation. Pour en savoir plus, regardez « Cook up a rich text experience in SwiftUI with AttributedString ». Vous pouvez personnaliser les styles de paragraphe, transformer les attributs et même limiter les attributs que les utilisateurs sont autorisés à utiliser dans votre app. Vous en voulez encore ? Regardez « Explore localization with Xcode » pour vous plonger dans la création d’expériences exceptionnelles pour toutes les langues. C’est vraiment passionnant de découvrir toutes les nouveautés de SwiftUI. Et de nombreuses passerelles vers d’autres choses. Regarde cette photo de ma dernière randonnée.
Nous devrions y aller la prochaine fois. Il est temps pour nous d’aller prendre d’autres photos avec nos nouvelles apps. Dans vos apps, allez voir le tout nouveau design et les nouvelles API, puis peaufinez votre app à l’aide des nouvelles API. Évaluez la performance de votre app avec le nouvel instrument de performance. Découvrez votre app sous un nouvel angle grâce aux ajouts apportés au volume et à la nouvelle disposition spatiale. Ajoutez des expériences plus riches à vos apps grâce aux améliorations apportées à Rich Text et à WebKit. Et profitez de la présence des commandes et des widgets dans plus d’endroits que jamais. Nous espérons que vous apprécierez vos aventures cette année dans SwiftUI. Je me demande si ces améliorations de performances pourront m’aider à gravir des collines. Tu es prêt ? C’est parti !
-
-
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.