-
Créez un UIKit app avec le nouveau design
Mettez à jour votre app UIKit pour tirer pleinement parti du nouveau système de conception. Nous nous pencherons sur les principales modifications apportées aux vues d'onglets, aux vues fractionnées, aux barres, aux présentations, à la recherche et aux commandes, et nous vous montrerons comment utiliser Liquid Glass dans votre interface utilisateur personnalisée. Pour tirer le meilleur parti de cette vidéo, nous vous recommandons de regarder d'abord « Apprenez à connaître le nouveau système de conception » pour obtenir des conseils généraux sur la conception.
Chapitres
- 0:00 - Introduction
- 1:55 - Vues par onglets et vues scindées
- 7:19 - Navigation et barres d’outils
- 13:31 - Présentations
- 15:18 - Recherche
- 17:24 - Contrôles
- 19:15 - Éléments personnalisés
- 25:01 - Étapes suivantes
Ressources
Vidéos connexes
WWDC25
- Découvrez le nouveau système de conception
- Découvrez Liquid Glass
- Nouveautés dans UIKit
- Rendez votre app UIKit plus flexible
WWDC24
-
Rechercher dans cette vidéo…
-
-
2:31 - Minimize tab bar on scroll
// Minimize tab bar on scroll tabBarController.tabBarMinimizeBehavior = .onScrollDown -
3:08 - Add a bottom accessory
// Add a bottom accessory let nowPlayingView = NowPlayingView() let accessory = UITabAccessory(contentView: nowPlayingView) tabBarController.bottomAccessory = accessory -
3:35 - Update the accessory with the tabAccessoryEnvironment trait
// Update the accessory with the trait registerForTraitChanges([UITraitTabAccessoryEnvironment.self]) { (view: MiniPlayerView, _) in let isInline = view.traitCollection.tabAccessoryEnvironment == .inline view.updatePlayerAppearance(inline: isInline) } // Automatic trait tracking with updateProperties() override func updateProperties() { super.updateProperties() let isInline = traitCollection.tabAccessoryEnvironment == .inline updatePlayerAppearance(inline: isInline) } -
5:51 - Extend content under the sidebar
// Extend content underneath the sidebar let posterImageView = UIImageView(image: ...) let extensionView = UIBackgroundExtensionView() extensionView.contentView = posterImageView view.addSubview(extensionView) let detailsView = ShowDetailsView() view.addSubview(detailsView) -
6:51 - Adjust the effect layout
// Adjust the effect layout let posterImageView = UIImageView(image: ...) let extensionView = UIBackgroundExtensionView() extensionView.contentView = posterImageView extensionView.automaticallyPlacesContentView = false view.addSubview(extensionView) posterImageView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ posterImageView.topAnchor.constraint(equalTo: extensionView.topAnchor), posterImageView.leadingAnchor.constraint(equalTo: extensionView.safeAreaLayoutGuide.leadingAnchor), posterImageView.trailingAnchor.constraint(equalTo: extensionView.safeAreaLayoutGuide.trailingAnchor), posterImageView.bottomAnchor.constraint(equalTo: extensionView.safeAreaLayoutGuide.bottomAnchor), ]) -
8:38 - Custom grouping
// Custom grouping navigationItem.rightBarButtonItems = [ doneButton, flagButton, folderButton, infoButton, .fixedSpace(0), shareButton, selectButton ] -
8:53 - UIBarButtonItem tint color and style
// Tint color and style let flagButton = UIBarButtonItem(image: UIImage(systemName: "flag.fill")) flagButton.tintColor = .systemOrange flagButton.style = .prominent -
9:10 - Toolbar with evenly distributed items in a single background
// Toolbar with evenly distributed items, grouped in a single background. let flexibleSpace = UIBarButtonItem.flexibleSpace() flexibleSpace.hidesSharedBackground = false toolbarItems = [ .init(image: UIImage(systemName: "location")), flexibleSpace, .init(image: UIImage(systemName: "number")), flexibleSpace, .init(image: UIImage(systemName: "camera")), flexibleSpace, .init(image: UIImage(systemName: "trash")), ] -
10:15 - Titles and subtitles
// Titles and subtitles navigationItem.title = "Inbox" navigationItem.subtitle = "49 Unread" -
10:27 - Large subtitle view
// Titles and subtitles navigationItem.title = "Inbox" navigationItem.largeSubtitleView = filterButton -
11:20 - Edge effect for a custom container
// Edge effect’s custom container let interaction = UIScrollEdgeElementContainerInteraction() interaction.scrollView = contentScrollView interaction.edge = .bottom buttonsContainerView.addInteraction(interaction) -
11:48 - Hard edge effect style
// Hard edge effect style scrollView.topEdgeEffect.style = .hard -
13:55 - Morph popover from its source button
// Morph popover from its source button viewController.popoverPresentationController?.sourceItem = barButtonItem -
14:07 - Morph sheet from bar button
// Morph sheet from bar button viewController.preferredTransition = .zoom { _ in folderBarButtonItem } -
14:46 - Source item for action sheets
// Setting source item for action sheets alertController.popoverPresentationController?.sourceItem = barButtonItem -
15:36 - Placing search in the toolbar
// Place search bar in a toolbar toolbarItems = [ navigationItem.searchBarPlacementBarButtonItem, .flexibleSpace(), addButton ] -
16:01 - Universally accessible search on iPad
// Place search at the trailing edge of the navigation bar navigationItem.searchBarPlacementAllowsExternalIntegration = true -
16:47 - Activate the search field when search bar is tapped
// Activate the search field when search bar is tapped searchTab.automaticallyActivatesSearch = true -
17:03 - Search as a dedicated view
// Search as a dedicated view navigationItem.preferredSearchBarPlacement = .integratedCentered -
17:52 - Buttons
// Standard glass button.configuration = .glass() // Prominent glass tintedButton.configuration = .prominentGlass() -
18:16 - Neutral slider with 5 ticks and a neutral value
// Neutral slider with 5 ticks and a neutral value slider.trackConfiguration = .init(allowsTickValuesOnly: true, neutralValue: 0.2, numberOfTicks: 5) -
18:59 - Thumbless slider
// Thumbless slider slider.sliderStyle = .thumbless -
20:28 - Glass for custom views
// Adopting glass for custom views let effectView = UIVisualEffectView() addSubview(effectView) let glassEffect = UIGlassEffect() // Animating setting the effect results in a materialize animation UIView.animate { effectView.effect = glassEffect } -
20:49 - Custom corner configuration
// Custom corner configuration UIView.animate { effectView.cornerConfiguration = .fixed(8) } -
20:54 - Dark mode
// Adapting to dark mode UIView.animate { view.overrideUserInterfaceStyle = .dark } -
21:02 - Adding glass to an existing glass container
// Adding glass to an existing glass container let container = UIVisualEffectView() container.effect = UIGlassEffect() container.contentView.addSubview(effectView) -
21:08 - Container relative corners
// Container relative corners UIView.animate { effectView.cornerConfiguration = .containerRelative() effectView.frame.origin = CGPoint(x: 10, y: 10) } -
21:23 - Container relative corners, animated
// Container relative corners UIView.animate { effectView.frame.origin = CGPoint(x: 30, y: 30) } -
21:30 - Glass adapts based on its size
// Glass adapts based on its size UIView.animate { view.overrideUserInterfaceStyle = .light effectView.bounds.size = CGSize(width: 250, height: 88) } UIView.animate { effectView.bounds.size = CGSize(width: 150, height: 44) } -
21:49 - Adding content to glass views
// Adding content to glass views let label = UILabel() label.text = "WWDC25" label.textColor = .secondaryLabel effectView.contentView.addSubview(label) -
22:15 - Applying tint color to glass
// Applying tint color to glass let glassEffect = UIGlassEffect() glassEffect.tintColor = .systemBlue UIView.animate { effectView.effect = glassEffect label.textColor = .label } -
22:33 - Using custom colors with glass
// Using custom colors with glass let glassEffect = UIGlassEffect() glassEffect.tintColor = UIColor(displayP3Red: r, green: g, blue: b, alpha: 1) UIView.animate { effectView.effect = glassEffect // Animate out the label label.alpha = 0 } -
23:03 - Enabling interactive glass behavior
// Enabling interactive glass behavior let glassEffect = UIGlassEffect() glassEffect.isInteractive = true effectView.effect = glassEffect -
23:20 - Animating glass out using dematerialize animation
// Animating glass out using dematerialize animation UIView.animate { effectView.effect = nil } -
23:52 - Adding glass elements to a container
// Adding glass elements to a container let container = UIGlassContainerEffect() let containerView = UIVisualEffectView(effect: container) let glassEffect = UIGlassEffect() let view1 = UIVisualEffectView(effect: glassEffect) let view2 = UIVisualEffectView(effect: glassEffect) containerEffectView.contentView.addSubview(view1) containerEffectView.contentView.addSubview(view2) -
24:12 - Adjusting the container spacing
// Adjusting the container spacing let containerEffect = UIGlassContainerEffect() containerEffect.spacing = 20 containerEffectView.effect = containerEffect -
24:27 - Merging two glass views
// Merging two glass views UIView.animate { view1.frame = finalFrame view2.frame = finalFrame } -
24:33 - Dividing glass into multiple views
// Dividing glass into multiple views UIView.performWithoutAnimation { for view in finalViews { containerEffectView.contentView.addSubview(view) view.frame = startFrame } } UIView.animate { for view in finalViews { view.frame = finalFrame(for: view) } }
-
-
- 0:00 - Introduction
Découvrez comment intégrer le nouveau langage de conception d’iOS 26 à vos apps. La nouvelle conception, centrée sur le style dynamique et translucide appelé Liquid Glass, met automatiquement à jour l’apparence des apps recompilées avec le dernier SDK. Cette vidéo couvre divers aspects de la nouvelle conception, notamment la nouvelle apparence et le nouveau comportement des vues par onglets, des vues scindées, des barres de navigation, des barres d’outils, etc., qui comportent désormais des éléments Liquid Glass. Elle propose également des conseils sur l’application de Liquid Glass aux éléments d’interface utilisateur personnalisés.
- 1:55 - Vues par onglets et vues scindées
Grâce à leur mise à jour, « UITabBarController » et « UISplitViewController » ont désormais une apparence Liquid Glass moderne. Les barres d’onglets de l’iPhone flottent désormais au-dessus du contenu et peuvent être réduites lors du défilement, pour améliorer la concentration. Vous pouvez personnaliser ce comportement et ajouter une vue accessoire au-dessus de la barre d’onglets, qui s’anime vers le bas lorsqu’elle est réduite. Sur iPad, les barres d’onglets et les barres latérales flottent également dans Liquid Glass. Les apps qui adoptent « UITab » et « UITabGroup » basculent automatiquement entre les vues barre d’onglets et barre latérale. Les barres latérales sont plus esthétiques lorsqu’elles recouvrent un contenu dynamique, et ce grâce à la nouvelle « UIBackgroundExtensionView » qui crée un effet visuel transparent.
- 7:19 - Navigation et barres d’outils
Dans iOS 26, la navigation et les barres d’outils présentent une nouvelle apparence semblable à du verre, flottant au-dessus du contenu et rassemblant automatiquement les éléments des boutons de barre en groupes visuels partageant des arrière-plans translucides. Les boutons de texte, les boutons « Terminé » et « Fermer » du système, ainsi que les boutons au style marqué ont des arrière-plans distincts. Vous pouvez personnaliser les groupes de boutons, les couleurs de teinte et les arrière-plans. « UINavigationItem » offre un meilleur contrôle sur les zones de titre et de grand titre, et permet également de définir des sous-titres. Les vues de défilement situées sous les barres de navigation ou les barres d’outils appliquent un effet de bord pour la lisibilité.
- 13:31 - Présentations
Le design des présentations, des menus, des fenêtres contextuelles, des fiches et des feuilles Action est maintenant mis à jour pour améliorer la continuité visuelle. Les boutons en verre se transforment en incrustations pour les menus et les fenêtres contextuelles, et les fiches adaptent désormais leur apparence en passant de petites à de grandes hauteurs. Sur iPhone comme sur iPad, les feuilles Action sont ancrées à leur vue source et apparaissent directement au-dessus. Supprimez les arrière-plans personnalisés des fiches et spécifiez des vues sources pour les feuilles Action et les contrôleurs d’alerte afin d’appliquer les nouvelles transitions et les nouveaux comportements. Les feuilles Action intégrées sur iPhone n’ont plus de bouton d’annulation, car le fait de toucher n’importe où ailleurs les fait disparaître.
- 15:18 - Recherche
iOS 26 améliore l’expérience de recherche sur iPhone et iPad. Sur iPhone, la barre de recherche se trouve désormais dans la barre d’outils, apparaissant sous forme de champ étendu ou de bouton en fonction de l’espace. Sur iPad, la recherche se trouve au niveau du bord arrière de la barre de navigation pour les vues scindées ou se présente sous forme d’onglet dédié dans un « UITabBarController » et se transforme en champ de recherche lorsque vous touchez l’écran. Vous pouvez également personnaliser le placement de la recherche dans les barres latérales, les barres d’onglets et les barres de navigation, et permettre l’activation automatique des champs de recherche une fois l’onglet sélectionné.
- 17:24 - Contrôles
Les commandes iOS ont subi une refonte subtile, conservant leur familiarité tout en intégrant de nouveaux effets Liquid Glass. Les curseurs ont des fonctionnalités améliorées telles que la conservation de l’élan, l’étirement et la possibilité d’afficher des marques de graduation, des valeurs neutres ainsi qu’un style sans bouton ressemblant à une barre de progression. Deux nouvelles apparences Liquid Glass sont disponibles pour les boutons. Assurez-vous que vos dispositions prennent en charge les tailles de commande mises à jour.
- 19:15 - Éléments personnalisés
UIKit fournit des API pour vous permettre d’appliquer Liquid Glass à votre interface utilisateur personnalisée. Utilisez Liquid Glass avec parcimonie pour les éléments les plus importants. Appliquez l’effet à des vues personnalisées à l’aide d’une « UIVisualEffectView » et d’un « UIGlassEffect », puis personnalisez la forme, l’apparence et la couleur de la teinte. Vous pouvez animer les éléments Liquid Glass pour qu’ils se matérialisent, se dématérialisent et fusionnent comme des gouttelettes d’eau lorsqu’ils se chevauchent. Le « UIGlassContainerEffect » assure une adaptation uniforme et une cohérence entre les différents arrière-plans. Les éléments interactifs peuvent s’élargir et rebondir après l’interaction utilisateur, améliorant ainsi l’expérience.
- 25:01 - Étapes suivantes
Liquid Glass introduit de nouveaux composants et matériaux UIKit que vous pouvez facilement intégrer dans les apps. Compilez vos apps avec Xcode 26, auditez chaque écran et envisagez de remplacer les contrôles personnalisés par des contrôles UIKit standard. Utilisez Liquid Glass pour améliorer le design de votre app, tout en mettant en valeur des cas d’utilisation spécifiques.