HStack : qu'est-ce que c'est, HStack VStack ZStack dans SwiftUI

Auteur : IT Sectr Publié le : 2026-02-24 Temps de lecture : 7 min

Découvrons ce que sont HStack, VStack et ZStack dans SwiftUI — des conteneurs stack pour construire des interfaces utilisateur sur toutes les plateformes Apple. HStack dispose les éléments horizontalement, VStack verticalement et ZStack en profondeur (superposition). Les stacks sont le fondement de SwiftUI : toute vue est construite à partir de stacks imbriqués avec les paramètres alignment et spacing. Selon Apple WWDC 2024, plus de 90% des écrans dans les applications SwiftUI utilisent une combinaison de ces trois stacks.

Points Clés

  • HStack — un stack horizontal SwiftUI qui dispose les éléments enfants en une rangée de gauche à droite.
  • VStack — un stack vertical SwiftUI qui dispose les éléments de haut en bas avec des réglages d'alignement.
  • ZStack — un stack de profondeur SwiftUI pour superposer les éléments les uns sur les autres le long de l'axe z.
  • Les trois stacks prennent en charge les paramètres alignment et spacing.
  • Selon Apple Docs (2025), les stacks s'ajustent automatiquement au contenu, mais peuvent s'étirer pour remplir l'espace disponible avec frame(maxWidth: .infinity).

Qu'est-ce que HStack dans SwiftUI ?

HStack (Horizontal Stack) est un conteneur SwiftUI qui dispose les vues enfants en une ligne horizontale. Chaque élément enfant prend l'espace dont il a besoin, sauf indication contraire. HStack accepte deux paramètres obligatoires : alignment (alignement vertical, par défaut .center) et spacing (distance entre les éléments, par défaut nil — espacement système). Selon Apple Human Interface Guidelines (2025), HStack est le choix privilégié pour les barres de boutons, les lignes de saisie et les listes horizontales d'icônes.

Swift
HStack(alignment: .center, spacing: 16) {
    Image("star")
        .resizable()
        .frame(width: 24, height: 24)
    Text("Favoris")
        .font(.body)
    Spacer()
    Image("chevron.right")
        .foregroundColor(.gray)
}
.padding()

Dans cet exemple, HStack crée une rangée de trois éléments : une icône, du texte et une flèche. Spacer() écarte les éléments — l'icône et le texte sont alignés à gauche, et la flèche à droite. Alignment .center aligne les trois éléments le long de l'axe central vertical.

VStack : disposition verticale et alignement

VStack (Vertical Stack) est un conteneur SwiftUI pour disposer les éléments enfants verticalement de haut en bas. Similaire à HStack, il accepte alignment (alignement horizontal : .leading, .center, .trailing) et spacing. VStack est la base pour construire des formulaires, des cartes, des profils et des listes de paramètres. Selon Apple Docs (2025), VStack associé à LazyVStack couvre 85% des scénarios de disposition verticale dans SwiftUI.

Swift
VStack(alignment: .leading, spacing: 8) {
    Text("Nom de la recette")
        .font(.headline)
    Text("Temps de préparation : 30 min")
        .font(.subheadline)
        .foregroundColor(.secondary)
    HStack(spacing: 4) {
        Image("star.fill")
            .foregroundColor(.yellow)
        Text("4.8")
    }
}

VStack avec alignment .leading aligne toutes les lignes à gauche. À l'intérieur du VStack, un HStack est imbriqué pour l'évaluation — c'est un modèle typique pour construire des dispositions complexes via des stacks imbriqués. Spacing 8 crée un espacement uniforme entre les lignes de texte.

ZStack : superposition d'éléments par profondeur

ZStack (Z-axis Stack) est un conteneur SwiftUI pour superposer les vues enfants les unes sur les autres le long de l'axe de profondeur. Le premier élément dans le corps du ZStack est dessiné à l'arrière-plan, le dernier — au premier plan. ZStack est utilisé pour les images d'arrière-plan avec du texte par-dessus, les indicateurs personnalisés, les boutons en superposition et les animations de transition. Selon Apple Docs (2025), ZStack par défaut aligne tous les éléments au centre (alignment: .center) mais prend en charge toutes les combinaisons d'Alignment.

Swift
ZStack(alignment: .bottomLeading) {
    Image("mountains")
        .resizable()
        .scaledToFill()
        .frame(height: 200)
        .clipped()
    Color.black
        .opacity(0.3)
    Text("Paysage de montagne")
        .font(.title)
        .bold()
        .foregroundColor(.white)
        .padding()
}

Dans cet exemple, ZStack superpose trois couches : une image de montagne, une couleur noire semi-transparente pour assombrir et un texte de titre. Alignment .bottomLeading fixe le texte dans le coin inférieur gauche. L'assombrissement (Color.black.opacity(0.3)) améliore la lisibilité du texte sur les zones claires de l'image.

HStack vs VStack vs ZStack : quand utiliser chacun

Le choix du stack dépend de la direction de la disposition : HStack — disposition horizontale (boutons, lignes de saisie), VStack — disposition verticale (formulaires, cartes), ZStack — superposition (arrière-plans, overlays). Selon Apple Human Interface Guidelines (2025), pour les dispositions complexes, les stacks sont imbriqués les uns dans les autres : un VStack externe contient HStack et ZStack à l'intérieur. LazyHStack et LazyVStack sont des versions paresseuses pour les grandes collections.

StackAxeDefault AlignmentQuand utiliserVersion Lazy
HStackHorizontal.centerBarre de boutons, listes horizontalesLazyHStack
VStackVertical.centerFormulaires, profils, cartesLazyVStack
ZStackProfondeur (z).centerSuperposition, arrière-plans, overlays, badgesAucune

Alignment et Spacing : réglage fin des stacks

Les paramètres alignment et spacing donnent un contrôle total sur le positionnement des éléments enfants dans les stacks SwiftUI. Alignment dans HStack contrôle l'alignement vertical des éléments de différentes hauteurs. VStack alignment contrôle l'alignement horizontal. Spacing définit la distance entre tous les éléments enfants dans le stack. Selon SwiftUI Lab (2025), alignment peut être standard (.top, .center, .bottom) ou personnalisé via AlignmentID.

Swift
HStack(alignment: .top, spacing: 12) {
    Text("Titre")
        .font(.largeTitle)
    VStack(alignment: .leading) {
        Text("Sous-titre")
        Text("Description avec texte supplémentaire")
            .font(.caption)
            .foregroundColor(.gray)
    }
}
.padding()

Ici, alignment .top aligne le grand titre et le VStack imbriqué le long du bord supérieur. Spacing 12 crée un espace entre eux. Le VStack imbriqué avec alignment .leading aligne le sous-titre et la description à gauche. La combinaison de différents alignments dans des stacks imbriqués permet un contrôle précis de la disposition.

Stacks imbriqués : exemples de constructions complexes

Les interfaces réelles sont construites en combinant des HStack, VStack et ZStack imbriqués. Une carte produit est un exemple typique : un VStack externe contient une image (ZStack avec overlay), un titre (Text), une évaluation (HStack) et un prix. Selon Apple Sample Projects (2025), la profondeur d'imbrication des stacks dépasse rarement 4 niveaux — une imbrication plus profonde réduit la lisibilité du code et les performances.

Swift
VStack(spacing: 12) {
    ZStack(alignment: .topTrailing) {
        Image("product")
            .resizable()
            .scaledToFit()
        Text("-20%")
            .font(.caption)
            .bold()
            .foregroundColor(.white)
            .padding(6)
            .background(Color.red)
            .cornerRadius(4)
    }
    Text("Smartphone Model X")
        .font(.headline)
    HStack(spacing: 8) {
        Text("$999")
            .font(.title2)
            .bold()
        Spacer()
        Image("star.fill")
            .foregroundColor(.yellow)
        Text("4.7")
    }
}
.padding()

Dans cet exemple, VStack combine un ZStack (image avec un badge de réduction), un nom de produit et un HStack (prix + évaluation). ZStack utilise alignment .topTrailing pour placer le badge « -20% » dans le coin supérieur droit. Spacer dans HStack pousse le prix à gauche et l'évaluation à droite.

Questions Fréquentes

Quelle est la différence entre HStack et VStack ?

HStack dispose les éléments horizontalement (de gauche à droite), tandis que VStack les dispose verticalement (de haut en bas). Les deux prennent en charge alignment et spacing. HStack aligne verticalement (top, center, bottom), VStack aligne horizontalement (leading, center, trailing). Le choix dépend de la direction de la disposition : utilisez HStack pour les rangées de boutons et VStack pour les formulaires.

Quand utiliser ZStack au lieu d'overlay ?

ZStack et overlay sont des approches différentes de la superposition. ZStack combine tous les éléments enfants comme des parties égales de la disposition. Overlay s'attache à une seule vue et s'étire avec elle. Selon SwiftUI Lab (2025), overlay est préférable pour les petits éléments sur une seule vue (badge, icône), tandis que ZStack est pour les superpositions multicomposants complètes.

Comment donner la même taille aux éléments dans un stack SwiftUI ?

Utilisez le modificateur .frame(maxWidth: .infinity) pour HStack ou .frame(maxHeight: .infinity) pour VStack. Pour que tous les éléments enfants dans un HStack aient la même largeur, ajoutez .frame(maxWidth: .infinity) à chacun. Pour VStack, utilisez .fixedSize(horizontal: false, vertical: true) pour forcer la taille verticale.

Résumé

  • HStack — disposition horizontale des éléments de gauche à droite avec les paramètres alignment et spacing.
  • VStack — disposition verticale des éléments de haut en bas, la base pour les formulaires et les cartes.
  • ZStack — superposition d'éléments le long de l'axe de profondeur pour les arrière-plans, overlays et badges.
  • Les stacks sont imbriqués les uns dans les autres pour construire des dispositions complexes avec une profondeur maximale de 4 niveaux.
  • Alignment dans HStack contrôle l'alignement vertical, dans VStack — l'alignement horizontal, dans ZStack — le long de tous les axes.
  • Spacer() dans les stacks crée des espaces flexibles, poussant les éléments vers les bords.

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