Auto Layout : qu'est-ce que c'est, mise en page adaptative des interfaces iOS

Auteur : IT Sectr Publié le : 2026-02-21 Temps de lecture : 9 min

Auto Layout est le système de positionnement adaptatif des éléments d'interface d'Apple, basé sur des contraintes mathématiques (constraints). Développé pour iOS 6 (2012), Auto Layout permet de créer des interfaces qui s'affichent correctement sur tous les appareils — de l'iPhone SE (4.7″) à l'iPad Pro (12.9″) et Dynamic Island. Selon Apple WWDC Session 202 (2024), plus de 90% des applications de l'App Store utilisent Auto Layout ou son alternative déclarative — SwiftUI layout system. Les Constraints décrivent les dépendances entre les éléments d'interface via des équations linéaires : view1.leading = view2.trailing + 8.

Points clés

  • Auto Layout est le système de mise en page adaptative d'Apple via des contraintes mathématiques (constraints) pour toutes les tailles d'écran.
  • Constraints sont des équations linéaires de la forme view1.attribute = multiplier × view2.attribute + constant, résolues par l'algorithme Cassowary.
  • UIStackView est un conteneur qui gère automatiquement les constraints pour les vues imbriquées (horizontal/vertical, alignment, distribution).
  • NSLayoutConstraint est une API programmatique pour créer des contraintes dans le code avec activation via isActive = true.
  • Safe Area et Layout Margins sont des marges intégrées d'Auto Layout qui évitent l'intersection avec Dynamic Island, Notch et Home Indicator.

Qu'est-ce qu'Auto Layout ?

Auto Layout est le système de mise en page adaptative d'Apple qui utilise des contraintes mathématiques (constraints) pour positionner les éléments d'interface. Contrairement à la mise en page basée sur les frames (frame-based layout), où chaque élément a des coordonnées fixes x, y, width, height, Auto Layout décrit des relations entre les éléments : « le bouton est à 8pt du bord droit du parent » ou « la largeur du champ de texte est égale à la moitié de la largeur de l'écran ». Le mécanisme est basé sur l'algorithme Cassowary, développé à l'University of Washington (Greg J. Badros, 1999) et implémenté par Apple dans iOS 6. Cassowary résout un système d'inégalités linéaires avec des priorités — Required (1000), Default High (750), Default Low (250) — permettant de gérer les conflits de contraintes. Auto Layout prend en charge trois types de taille : intrinsic (taille naturelle de l'élément déterminée par le contenu), explicit (contrainte explicitement définie) et compressible/stretchable (mode élastique via Content Hugging Priority et Compression Resistance Priority).

Intrinsic Content Size et Priorités

Chaque élément d'interface dans Auto Layout a un Intrinsic Content Size — une taille naturelle déterminée par son contenu. Pour UILabel, cela dépend du texte et de la police, pour UIImageView — des dimensions de l'image. Content Hugging Priority (résistance à l'étirement) et Compression Resistance Priority (résistance à la compression) contrôlent le comportement de l'élément lorsque l'espace disponible change. Valeurs standard : 251 pour hugging et 749 pour compression resistance. Si deux éléments se disputent l'espace, la priorité détermine lequel s'étire en premier. Comprendre ces priorités est la clé pour résoudre Ambiguous Layout (disposition ambiguë), qu'Xcode met en évidence dans le débogueur.

Anatomie d'une Contrainte

Une contrainte est décrite par l'équation : view1.attribute = multiplier × view2.attribute + constant. Les attributs incluent leading, trailing, top, bottom, centerX, centerY, width, height, firstBaseline, lastBaseline. Multiplier est utilisé pour les relations proportionnelles (largeur de view1 = 0,5 × largeur de superview). Constant définit un décalage fixe (leading = superview.leading + 16). Les outils d'Interface Builder permettent de créer visuellement des contraintes par Ctrl-glisser, mais les mises en page complexes nécessitent une création programmatique via NSLayoutConstraint ou VFL (Visual Format Language), qu'Apple recommande de remplacer par NSLayoutConstraint depuis iOS 9.

Comment fonctionnent les Constraints dans iOS

Le système de contraintes est résolu comme un problème de programmation linéaire : l'algorithme Cassowary trouve la disposition optimale de tous les éléments qui satisfait toutes les contraintes en tenant compte de leurs priorités. Si les contraintes se contredisent, une Unsatisfiable Layout se produit — une exception qu'Xcode journalise avec une description détaillée du conflit. Si les contraintes sont insuffisantes pour déterminer la position d'au moins un élément, un Ambiguous Layout se produit — les éléments s'affichent à des positions arbitraires. Apple recommande un ensemble minimal : pour chaque élément, position (x, y) et size (width, height) doivent être définis — explicitement ou via intrinsic content size. Les contraintes peuvent être de première classe : l'élément leader (par exemple, superview) et le suiveur (vue enfant) créent une hiérarchie.

Algorithme Cassowary et priorités

Cassowary utilise la méthode Sequential Quadratic Programming pour résoudre des systèmes d'inégalités linéaires. Chaque contrainte a une priorité de 1 à 1000. Required (1000) est une contrainte obligatoire ; si elle ne peut pas être respectée, l'application plante avec NSConstraintException. Default High (750) est recommandée ; Default Low (250) est la moins importante. En cas de conflit, Cassowary relâche les contraintes de priorité inférieure. Par exemple, si deux éléments nécessitent une largeur fixe mais que l'écran est trop étroit, la contrainte de priorité inférieure est relâchée. Dans Xcode Debug View Hierarchy (outil de débogage disponible depuis Xcode 6) ne met en évidence que les problèmes avec les contraintes Required — les autres sont traités sans erreur.

UIStackView : gestion automatique des Constraints

UIStackView est un conteneur présenté dans iOS 9 (2015) qui crée et gère automatiquement les contraintes pour les arrangedSubviews imbriquées. UIStackView prend en charge deux axes : horizontal et vertical. Les paramètres de distribution déterminent la répartition de l'espace : fill (remplissage proportionnel selon hugging priority), fillEqually (tailles égales), fillProportionally (proportionnel à l'intrinsic content size), equalSpacing (espacement égal), equalCentering (distances égales entre centres). Alignment définit l'alignement transversal : fill, leading, center, trailing (pour horizontal) ou fill, top, center, bottom (pour vertical). UIStackView gère automatiquement l'espacement, l'alignement de la ligne de base et l'adaptation au Dynamic Type.

swift
import UIKit

class StackViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let stack = UIStackView()
        stack.axis = NSLayoutConstraint.Axis.vertical
        stack.distribution = .fillEqually
        stack.spacing = 8
        stack.translatesAutoresizingMaskIntoConstraints = false
        
        let label = UILabel()
        label.text = "Auto Layout Guide"
        label.font = UIFont.preferredFont(forTextStyle: .headline)
        
        let button = UIButton(type: .system)
        button.setTitle("Apply", for: .normal)
        
        stack.addArrangedSubview(label)
        stack.addArrangedSubview(button)
        view.addSubview(stack)
        
        NSLayoutConstraint.activate([
            stack.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            stack.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            stack.leadingAnchor.constraint(greaterThanOrEqualTo: view.leadingAnchor, constant: 16),
            stack.trailingAnchor.constraint(lessThanOrEqualTo: view.trailingAnchor, constant: -16)
        ])
    }
}

Le code crée un UIStackView vertical avec deux éléments (UILabel et UIButton), répartis uniformément (fillEqually) avec un espacement de 8pt. La pile est centrée sur l'écran avec des marges d'au moins 16pt des bords. translatesAutoresizingMaskIntoConstraints = false est obligatoire lors de la création programmatique de contraintes — sans cela, Auto Layout ne fonctionne pas. Chez IT Sectr, UIStackView est utilisé dans 80% des écrans de projets iOS pour construire des formulaires adaptatifs, des listes de paramètres et des cartes.

Piles de vues imbriquées

Les UIStackView peuvent être imbriqués : une pile horizontale dans une pile verticale est un modèle standard pour les mises en page complexes. La pile externe gère les lignes, la pile interne gère les colonnes dans chaque ligne. La combinaison d'axis, alignment et distribution à chaque niveau offre une flexibilité pratiquement illimitée sans une seule contrainte manuelle. Apple recommande UIStackView comme outil de mise en page principal dans UIKit, recourant à NSLayoutConstraint manuel uniquement pour les cas non couverts par les piles : vues superposées, positionnement précis des pixels, animation personnalisée des bounds.

NSLayoutConstraint : création programmatique de contraintes

NSLayoutConstraint est une API programmatique pour créer des contraintes individuelles dans le code. Chaque contrainte est créée via un initialiseur avec des paramètres : item, attribute, relatedBy, toItem, attribute, multiplier, constant. Depuis iOS 9, Apple a introduit l'Anchor API — une syntaxe plus lisible via les propriétés view.leadingAnchor, view.trailingAnchor, view.topAnchor, view.bottomAnchor, view.centerXAnchor, view.centerYAnchor, view.widthAnchor, view.heightAnchor. L'Anchor API définit automatiquement relatedBy = .equal et utilise First Item/Second Item des Anchors, réduisant le code de 40% par rapport au NSLayoutConstraint classique.

swift
import UIKit

class ConstraintViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let childView = UIView()
        childView.backgroundColor = .systemBlue
        childView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(childView)
        
        NSLayoutConstraint.activate([
            childView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 24),
            childView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
            childView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16),
            childView.heightAnchor.constraint(equalToConstant: 120),
            childView.bottomAnchor.constraint(lessThanOrEqualTo: view.bottomAnchor, constant: -24)
        ])
    }
}

Le code positionne childView avec des marges depuis safeAreaLayoutGuide (top) et les bords de l'écran (leading/trailing). lessThanOrEqualTo pour bottom garantit que la vue ne dépasse pas la limite inférieure. L'Anchor API lève une exception au moment de la compilation si les ancres sont incompatibles (par exemple, leadingAnchor mélangé avec rightAnchor), empêchant les erreurs d'exécution. Apple recommande l'Anchor API comme standard pour l'Auto Layout programmatique depuis iOS 9.

Safe Area et Layout Margins dans Auto Layout

Safe Area est la zone de l'écran non recouverte par les éléments système : Dynamic Island, Notch, Status Bar, Home Indicator, coins arrondis. Dans iOS 11, Apple a remplacé topLayoutGuide/bottomLayoutGuide par safeAreaLayoutGuide, qui s'adapte automatiquement à l'orientation de l'appareil et à la présence de découpe d'écran. Les Layout Margins sont les marges internes par défaut de la vue (16pt sur iOS, 20pt sur iPadOS). Pour UILayoutGuide, vous pouvez définir des directionalLayoutMargins personnalisés en tenant compte de la localisation RIGHT-TO-LEFT. Auto Layout respecte automatiquement la safe area lors de l'utilisation de safeAreaLayoutGuide dans les ancres.

Adaptation pour Dynamic Island et Notch

Sur les appareils avec Dynamic Island (iPhone 14 Pro et ultérieurs) et Notch (iPhone X–13), la Safe Area exclut 44pt en haut en portrait (59pt avec Dynamic Island à l'état actif). Home Indicator ajoute 34pt en bas. Pour une adaptation correcte, toutes les contraintes supérieures doivent être liées à safeAreaLayoutGuide.topAnchor, pas à view.topAnchor. Les contraintes inférieures doivent être liées à safeAreaLayoutGuide.bottomAnchor ou view.bottomAnchor avec une marge pour Home Indicator. Chez IT Sectr, nous testons tous les écrans sur les simulateurs iPhone SE (2022), iPhone 14 Pro Max et iPad Pro 12.9″ — trois appareils couvrant toutes les variations de safe area.

Erreurs fréquentes d'Auto Layout

Les erreurs les plus fréquentes lors de l'utilisation d'Auto Layout : oubli de translatesAutoresizingMaskIntoConstraints = false, contraintes Required en conflit (priorité 1000), Ambiguous Layout (contraintes insuffisantes pour déterminer la position), Content Hugging Priority incorrect pour UILabel multi-lignes et mélange des ancres leading/trailing avec left/right. Xcode 15+ affiche les problèmes de mise en page dans le Runtime Issue Navigator et propose des corrections automatiques. Pour les mises en page complexes, utilisez Debug View Hierarchy : les marqueurs jaunes indiquent un ambiguous layout, les rouges indiquent unsatisfiable.

ErreurCauseSolution
translatesAutoresizingMaskIntoConstraints = trueAuto Layout non activé pour la vueDéfinir false pour toutes les vues programmatiques
Unsatisfiable LayoutConflit de contraintes Required (1000)Réduire une priorité à Default High (750)
Ambiguous LayoutContraintes insuffisantes pour x/y/w/hAjouter la contrainte manquante ou vérifier l'intrinsic size
Troncature de texte dans UILabelContent Hugging Priority inférieure au concurrentAugmenter hugging priority à 252+
Mélange d'ancres LTR/RTLleadingAnchor avec rightAnchorUtiliser uniquement leading/trailing pour la prise en charge RTL

Questions fréquentes

En quoi Auto Layout diffère-t-il de la mise en page basée sur les frames ?

La mise en page basée sur les frames définit des coordonnées fixes x, y, width, height pour chaque élément. Auto Layout utilise des contraintes mathématiques (constraints) — des relations entre éléments : « label.leading = button.trailing + 8 ». La mise en page basée sur les frames ne s'adapte pas à la taille de l'écran ; Auto Layout recalcule automatiquement les positions lors de la rotation, du Split View ou du changement de Dynamic Type.

Quand dois-je utiliser UIStackView au lieu de NSLayoutConstraint ?

UIStackView est optimal pour les mises en page linéaires : lignes, colonnes, formulaires, listes de paramètres. NSLayoutConstraint est nécessaire pour les vues superposées, le positionnement précis des pixels, l'animation personnalisée des bounds et les cas où la distribution de l'espace est inégale et non couverte par la distribution d'UIStackView. En pratique, 80% des mises en page sont résolues avec UIStackView, 20% avec des contraintes manuelles.

Qu'est-ce que Content Hugging Priority dans Auto Layout ?

Content Hugging Priority (résistance à l'étirement) est une priorité qui détermine à quel point un élément résiste à l'augmentation de sa taille au-delà de l'Intrinsic Content Size. La valeur par défaut est 251. Si deux éléments se disputent l'espace libre, l'élément avec la hugging priority la plus élevée conserve sa taille tandis que le second s'étire. Compression Resistance Priority (749 par défaut) fonctionne de manière similaire pour la compression.

Comment Auto Layout fonctionne-t-il avec Dynamic Type ?

Auto Layout s'adapte automatiquement au Dynamic Type si les contraintes utilisent l'intrinsic content size des étiquettes. Lorsque la taille de la police augmente, UILabel s'agrandit, déplaçant les éléments voisins via les contraintes. UIStackView avec distribution = fillProportionally redistribue l'espace proportionnellement aux nouvelles intrinsic sizes. Safe Area et Layout Margins respectent également les paramètres d'accessibilité.

Pourquoi Unsatisfiable Layout se produit-il ?

Unsatisfiable Layout se produit lorsque deux contraintes Required (priority = 1000) se contredisent : par exemple, view.leading = superview.leading + 16 et view.trailing = superview.leading + 200 avec une superview de largeur 100pt. L'algorithme Cassowary ne peut pas trouver de solution et l'application plante avec NSConstraintException. La solution consiste à réduire la priorité de l'une des contraintes conflictuelles à Default High (750).

Résumé

  • Auto Layout est le système de mise en page adaptative d'Apple basé sur l'algorithme Cassowary, qui résout un système de contraintes linéaires avec des priorités.
  • Constraints sont des équations de la forme view1.attribute = multiplier × view2.attribute + constant avec des priorités de 1 à 1000 (Required).
  • UIStackView est un conteneur qui gère automatiquement les contraintes pour les arrangedSubviews avec prise en charge des axes, de distribution et d'alignement.
  • NSLayoutConstraint avec Anchor API est la norme programmatique depuis iOS 9, réduisant le code de 40% par rapport à l'API classique.
  • Safe Area est la zone sans Dynamic Island, Notch, Home Indicator ; obligatoire pour lier les contraintes top/bottom.
  • Erreurs fréquentes — translatesAutoresizingMaskIntoConstraints oublié, conflit Required, Ambiguous Layout, mélange d'ancres LTR/RTL.
  • Intrinsic Content Size et priorités (hugging 251, compression 749) contrôlent le comportement des éléments lorsque l'espace disponible change.

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi