Skip to content
Tous les articles

Safe area et marges de contenu sur iPhone Duo : guide pour développeurs

L'iPhone Duo place les commandes sur le côté : safe areas et marges sont asymétriques. Gérez les insets horizontaux et adoptez .contentMargins(for: .container).

Par la rédaction AppleDuoPublié le 9 min de lecture

Également disponible en:EnglishDeutschEspañol日本語Türkçe

Sur cette page
  1. Pourquoi la safe area de l'iPhone Duo est-elle asymétrique ?
  2. Comment gérer les insets horizontaux de la safe area ?
  3. Que sont les marges asymétriques sur l'iPhone Duo ?
  4. Comment utiliser .contentMargins(for: .container) en SwiftUI ?
  5. Comment fonctionnent les marges de mise en page en UIKit sur l'iPhone Duo ?
  6. Quel est l'effet de la barre verticale sur les apps compilées avec d'anciens SDK ?
  7. Que vérifier avant de publier ?
  8. À retenir

Pendant des années, la safe area de l'iPhone a surtout été une affaire de haut et de bas : l'encoche ou la Dynamic Island en haut, l'indicateur d'accueil en bas. La safe area de l'iPhone Duo est différente. La navigation, les éléments de barre d'outils, les informations d'état et les Live Activities peuvent partager une même barre verticale le long du côté de l'écran : les insets gauche et droit sont donc souvent inégaux. Ce guide explique ce qui a changé, quelles API utiliser en SwiftUI et en UIKit, et comment vérifier votre mise en page avant de publier.

Tout ce qui suit provient des Tech Talks d'Apple consacrés à l'iPhone Duo, de la documentation d'Apple et des réponses sur les forums développeurs, ainsi que des publications du développeur iOS @sarunw. Nous n'avons pas testé ces API nous-mêmes sur un appareil réel. La plupart sont arrivées avec iOS 27.1 et Xcode 27.1 : certains détails peuvent donc encore changer d'une version à l'autre.

Pourquoi la safe area de l'iPhone Duo est-elle asymétrique ?

Sur l'iPhone Duo, de nombreuses commandes passent du haut et du bas de l'écran vers le côté. Le Tech Talk d'Apple « Design for iPhone Duo » le dit clairement : les commandes « sont placées le long du côté de l'appareil », et « la plupart des contenus ont besoin d'un décalage pour ne pas être masqués par les commandes ». La barre verticale est traitée en détail dans notre guide sur la barre d'outils verticale de l'iPhone Duo.

Ce décalage, c'est l'inset horizontal de la safe area. Dans Prepare your app for iPhone Duo, Apple indique que les safe areas sont « souvent asymétriques », en particulier sur l'iPhone Duo, où des boutons verticaux peuvent apparaître sur le côté gauche en paysage et en multitâche Split View. En Split View, le bord opposé peut aussi accueillir les commandes d'une autre app : les deux côtés comptent donc.

La barre verticale suit le matériel, et non le sens de lecture. Dans les langues qui s'écrivent de droite à gauche, elle reste du même côté de l'appareil : n'associez donc pas « le côté de la barre » à leading ou trailing. Lisez l'inset réel de chaque bord.

Comment gérer les insets horizontaux de la safe area ?

La règle d'Apple est courte : « Évitez de supposer que les insets des côtés opposés sont égaux. » Placez le contenu de premier plan dans la safe area, laissez les arrière-plans s'étendre en dessous et calculez les tailles à partir du rectangle réduit par les insets plutôt qu'à partir d'un seul côté.

SwiftUI place déjà le contenu dans la safe area par défaut. En UIKit, le Tech Talk d'Apple montre l'erreur courante et sa correction :

// À éviter : suppose que les insets gauche et droit sont égaux
let width = view.bounds.width - view.safeAreaInsets.left * 2

// Traiter chaque côté indépendamment
let width = view.bounds.inset(by: view.safeAreaInsets).width

La première ligne double l'inset gauche, ce qui est faux dès que la barre ne se trouve que d'un côté. La seconde ligne soustrait chaque bord séparément : elle fonctionne donc sur tout appareil et dans toute position.

Pour les arrière-plans, Apple recommande .ignoresSafeArea() en SwiftUI et, en UIKit, de dimensionner la vue d'arrière-plan selon view.bounds. Le Tech Talk « Design for iPhone Duo » suggère aussi une combinaison : « une image d'arrière-plan ou un en-tête pleine largeur avec un contenu de premier plan défilant et décalé », tant que chaque élément interactif reste dans la zone délimitée par les insets.

Dois-je rogner le contenu défilant sous la barre verticale ?

Non. Sur les forums développeurs, un ingénieur d'Apple a expliqué que le côté de la barre possède un inset de safe area qui « deviendra automatiquement un content inset de la scroll view », de sorte que tout le contenu reste accessible. Ne le rognez pas manuellement.

Que sont les marges asymétriques sur l'iPhone Duo ?

Les safe areas vous indiquent où se trouve l'interface système. Les marges vous indiquent à quelle distance du bord de son conteneur votre contenu doit se placer. Sur l'iPhone Duo, les deux peuvent varier selon le côté.

Selon @sarunw, l'iPhone Duo a « 20 points d'un côté, 0 à côté de la barre ». Cela correspond à la documentation d'Apple sur le nouveau guide de marges de conteneur, qui indique que les marges de mise en page système « vont de 16 à 20 points sur iPhone » et que sur l'iPhone Duo « la marge peut aussi être asymétrique, avec des valeurs différentes de chaque côté de l'appareil à côté d'une barre verticale ». Le Tech Talk d'Apple en explique la raison : les marges asymétriques permettent au contenu de premier plan de « se rapprocher des boutons verticaux et de la barre d'état, tout en préservant la marge du côté opposé ».

Les valeurs exactes en points proviennent de l'observation d'un développeur, et non d'une spécification d'Apple. Apple recommande de lire ou d'appliquer le guide « au lieu d'inscrire ces valeurs dans votre mise en page ».

ConceptCe qu'il mesureSur l'iPhone Duo
Insets de safe areaL'espace occupé par l'interface système, comme les barres et les camérasPlus grands du côté de la barre verticale
Marges de mise en page (UIKit)L'espacement recommandé entre le bord d'une vue et son contenuAsymétriques ; valeur par défaut nulle pour UIView dans iOS 27.1
Marges de contenu du conteneur (SwiftUI)Les marges système du conteneur dans lequel se trouve une vueDe 16 à 20 points sur iPhone ; peuvent être inégales à côté d'une barre

Comment utiliser .contentMargins(for: .container) en SwiftUI ?

iOS 27.1 ajoute contentMargins(for:edges:alignment:), un modificateur qui applique à une vue un retrait défini par un ContentMarginGuide. SwiftUI fournit un guide, container, décrit comme « les marges du conteneur dans lequel se trouve la vue ». Le paramètre edges vaut par défaut tous les bords, et alignment est facultatif.

Voici l'exemple de la documentation d'Apple. Il aligne une grille sur les marges système horizontales :

NavigationStack {
    AlbumGrid()
        .contentMargins(for: .container, edges: .horizontal)
}

Les bords que vous excluez restent inchangés, même lorsque le guide a une valeur pour eux. Cela fait de .horizontal un bon choix pour l'iPhone Duo, où ce sont les marges horizontales qui varient.

Lorsqu'une vue ne remplit pas la taille proposée, alignment la positionne à l'intérieur des marges. La documentation d'Apple utilise un bouton de rédaction placé dans le coin inférieur de fin (bottom-trailing) des marges de son conteneur :

ZStack {
    MessageList()
    ComposeButton()
        .contentMargins(
            for: .container, alignment: .bottomTrailing)
}

Il s'agit d'un modificateur différent des anciens contentMargins(_:for:) et contentMargins(_:_:for:), qui définissent une longueur fixe pour un emplacement comme le contenu défilant. Le nouveau prend un guide au lieu d'un nombre : la valeur peut donc varier selon l'appareil, le conteneur et la position.

Lire les marges depuis GeometryProxy

Si vous disposez les vues manuellement, GeometryProxy gagne contentMargins(for:edges:), qui renvoie des EdgeInsets. Cette méthode s'ajoute à la propriété existante safeAreaInsets :

GeometryReader { proxy in
    let margins = proxy.contentMargins(for: .container, edges: .horizontal)
    let safeArea = proxy.safeAreaInsets
    // margins.leading et margins.trailing peuvent différer sur iPhone Duo.
    CustomCanvas(leading: margins.leading, trailing: margins.trailing)
}

CustomCanvas représente ici votre propre vue. L'essentiel est de lire les deux bords séparément au lieu de supposer une valeur unique.

Comment fonctionnent les marges de mise en page en UIKit sur l'iPhone Duo ?

UIKit dispose déjà de marges de mise en page : layoutMargins, directionalLayoutMargins et layoutMarginsGuide. Le Tech Talk d'Apple indique qu'elles sont asymétriques sur l'iPhone Duo, tout comme les safe areas. Ancrer le contenu au margins guide de la vue racine d'un view controller récupère ces valeurs sans effort supplémentaire.

Il y a un changement à connaître. Dans un fil de discussion sur des marges qui semblaient défectueuses, un ingénieur d'Apple a expliqué que « dans iOS 27.1, les marges de mise en page par défaut d'une UIView deviennent nulles sur l'iPhone Duo », et que ce changement s'étend aux autres appareils dans iOS 27.2. Un view controller donne toujours à sa vue racine les systemMinimumLayoutMargins. Pour en hériter dans une sous-vue, réglez preservesSuperviewLayoutMargins sur true.

NSLayoutConstraint.activate([
    titleLabel.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor),
    titleLabel.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor)
])

// Une sous-vue personnalisée qui doit hériter des marges du view controller
cardView.preservesSuperviewLayoutMargins = true

Pour le contenu de cellules personnalisées, le même ingénieur a suggéré de lire les directionalLayoutMargins recommandées depuis UIListContentConfiguration.cell() plutôt que de s'appuyer sur la valeur par défaut d'UIView. Si vos cellules perdent soudain leur espacement intérieur sur l'iPhone Duo, vérifiez d'abord ce point.

Quel est l'effet de la barre verticale sur les apps compilées avec d'anciens SDK ?

La part de l'écran utilisée par votre app dépend du SDK avec lequel vous la compilez. Apple décrit trois étapes :

Compilée avecCe qui se passe sur l'iPhone Duo
Xcode 26 ou antérieurL'app s'exécute avec une taille et un rapport d'aspect familiers et ne s'étend pas sous la barre d'état et la caméra. Fermé, l'appareil lui laisse l'espace à gauche de la barre d'état et de la caméra.
SDK iOS 27L'app s'étend à gauche de la zone de la barre d'état sur l'écran interne.
SDK iOS 27.1 (Xcode 27.1)L'app s'étend jusqu'au bord de l'écran. Les boutons standard de navigation et de barre d'outils se disposent verticalement sous la barre d'état.

Les anciennes apps continuent de fonctionner, mais elles ne profitent pas de l'expérience complète. C'est en compilant avec le SDK iOS 27.1 que les insets et marges asymétriques commencent à compter, car votre contenu atteint alors le bord à côté de la barre. Apple précise aussi que l'iPhone Duo respecte UIRequiresFullScreen, mais que votre app est tout de même redimensionnée lorsque l'appareil est ouvert ou fermé.

La caméra est un cas à part. Sur les forums développeurs, Apple suggère d'interroger les régions d'occlusion plutôt que d'ignorer toute la safe area lorsque vous voulez un contenu pleine largeur. Notre guide sur les régions réservées et le pli présente ces API.

Que vérifier avant de publier ?

Les recommandations de design d'Apple consistent à « construire vos mises en page avec les marges de mise en page et les insets horizontaux de la safe area » et à éviter « les largeurs fixes, les points de rupture ou toute mesure liée à un écran précis ». Cela vous donne une courte checklist :

  1. Compilez avec Xcode 27.1 et le SDK iOS 27.1, puis exécutez votre app sur le simulateur iPhone Duo dans toutes les positions : fermé, ouvert, portrait et paysage.
  2. Recherchez dans votre code safeAreaInsets.left * 2 et les calculs similaires. Remplacez-les par bounds.inset(by:) ou par des valeurs propres à chaque bord.
  3. Ne codez pas en dur 16 ou 20 points. Appliquez .contentMargins(for: .container, edges: .horizontal) en SwiftUI ou ancrez-vous à layoutMarginsGuide en UIKit.
  4. Repérez les vues et cellules UIKit qui ont perdu leur espacement intérieur parce que les marges par défaut d'UIView sont désormais nulles sur l'iPhone Duo.
  5. Gardez chaque bouton et champ de texte dans la safe area. Ne laissez que les arrière-plans et les images décoratives s'étendre d'un bord à l'autre.
  6. Testez le multitâche Split View, où les commandes d'une autre app peuvent se trouver sur le bord opposé.
  7. Testez une langue qui s'écrit de droite à gauche. La barre reste du même côté de l'appareil.

Si vous adaptez toute une app, notre checklist de préparation pour l'iPhone Duo place ces points aux côtés des size classes, des feuilles et de la charnière.

À retenir

  • Sur l'iPhone Duo, les commandes peuvent se trouver sur le côté : les insets horizontaux de la safe area comptent donc autant que ceux du haut et du bas.
  • Ne supposez jamais que les insets gauche et droit sont identiques. Utilisez bounds.inset(by: safeAreaInsets) ou lisez chaque bord.
  • iOS 27.1 ajoute .contentMargins(for: .container, edges: .horizontal) et GeometryProxy.contentMargins(for:edges:) pour des marges système qui peuvent être inégales à côté d'une barre verticale.
  • En UIKit, ancrez-vous à layoutMarginsGuide, et notez que les marges par défaut d'UIView sont nulles sur l'iPhone Duo dans iOS 27.1.
  • Compilez avec le SDK iOS 27.1 pour atteindre le bord de l'écran, puis testez chaque position, Split View et les mises en page de droite à gauche.

Ensuite, découvrez comment le système déplace les barres sur le côté dans notre guide de la barre d'outils verticale, ou découvrez des apps qui exploitent déjà pleinement l'écran sur Built for the Fold.

Questions fréquentes

Pourquoi les insets de safe area gauche et droit sont-ils différents sur l'iPhone Duo ?

Sur l'iPhone Duo, des commandes système comme la barre verticale, les informations d'état et la caméra externe peuvent se trouver le long d'un côté de l'écran. Ce côté reçoit un inset plus grand que l'autre : un code qui suppose des insets égaux des deux côtés placera donc mal le contenu.

Que fait .contentMargins(for: .container, edges: .horizontal) ?

Ce modificateur applique à une vue un retrait égal aux marges système du conteneur dans lequel elle se trouve, sur les bords que vous choisissez. Il est nouveau dans SwiftUI pour iOS 27.1, et sur l'iPhone Duo la marge peut être différente de chaque côté lorsque la vue est à côté d'une barre verticale.

Les marges de mise en page par défaut des UIView ont-elles changé sur l'iPhone Duo ?

Oui. Selon un ingénieur d'Apple sur les forums développeurs, les marges de mise en page par défaut d'une UIView sont nulles sur l'iPhone Duo dans iOS 27.1, et le même changement s'étend aux autres appareils dans iOS 27.2. Un view controller donne toujours à sa vue racine les marges minimales du système.

Dois-je rogner le contenu défilant qui passe sous la barre verticale ?

Non. Les ingénieurs d'Apple indiquent que l'inset de safe area de ce côté devient automatiquement un content inset de la scroll view, de sorte que chaque élément reste accessible. Il est déconseillé de le rogner manuellement.

Que se passe-t-il pour les apps compilées avec d'anciens SDK sur l'iPhone Duo ?

Elles fonctionnent toujours. Les apps compilées avec Xcode 26 ou antérieur conservent une taille familière et ne s'étendent pas sous la barre d'état et la caméra. Compiler avec le SDK iOS 27.1 permet à l'app d'atteindre le bord de l'écran avec les barres verticales.

Sources

  1. Prepare your app for iPhone Duo · Apple Developer (Tech Talk)
  2. Design for iPhone Duo · Apple Developer (Tech Talk)
  3. Raise the bar with iPhone Duo · Apple Developer (Tech Talk)
  4. contentMargins(for:edges:alignment:) · Apple Developer Documentation
  5. ContentMarginGuide.container · Apple Developer Documentation
  6. GeometryProxy · Apple Developer Documentation
  7. Layout margins guides are still broken the iPhone Duo (sim) and 27.1 RC · Apple Developer Forums
  8. Horizontal scroll below tab bar · Apple Developer Forums
  9. iPhone Duo and the Safe-Area · Apple Developer Forums
  10. iPhone Duo has uneven margins: 20 points on one side, 0 next to the bar · @sarunw on X
  11. Safe areas aren't just at the top and bottom on iPhone Duo · @sarunw on X
  12. Safe area insets and content margins for iPhone Duo · @sarunw on X
  13. The vertical bar brings together Live Activities, status information, navigation and toolbar items · @sarunw on X
  14. Start with size classes, layout margins, and safe area insets · @sarunw on X

Faites du pli une partie de votre app.

Nous présentons les apps et les jeux qui exploitent vraiment l’iPhone Duo. Envoyez-nous la vôtre avec un lien vers l’App Store, ou découvrez ce que d’autres ont créé.

[email protected]