HStack: cos'è, HStack VStack ZStack in SwiftUI

Autore: IT Sectr Pubblicato: 2026-02-24 Tempo di lettura: 7 min

Esploriamo cosa sono HStack, VStack e ZStack in SwiftUI — contenitori stack per costruire interfacce utente su tutte le piattaforme Apple. HStack dispone gli elementi orizzontalmente, VStack verticalmente e ZStack in profondità (sovrapposizione). Gli stack sono il fondamento di SwiftUI: qualsiasi vista è costruita da stack annidati con parametri alignment e spacing. Secondo Apple WWDC 2024, oltre il 90% degli schermi nelle app SwiftUI utilizza una combinazione di questi tre stack.

Punti Chiave

  • HStack — uno stack orizzontale SwiftUI che dispone gli elementi figli in una riga da sinistra a destra.
  • VStack — uno stack verticale SwiftUI che dispone gli elementi dall'alto verso il basso con impostazioni di allineamento.
  • ZStack — uno stack di profondità SwiftUI per sovrapporre gli elementi l'uno sull'altro lungo l'asse z.
  • Tutti e tre gli stack supportano i parametri alignment e spacing.
  • Secondo Apple Docs (2025), gli stack si adattano automaticamente al contenuto, ma possono estendersi per riempire lo spazio disponibile con frame(maxWidth: .infinity).

Cos'è HStack in SwiftUI?

HStack (Horizontal Stack) è un contenitore SwiftUI che dispone le viste figlie in una linea orizzontale. Ogni elemento figlio occupa lo spazio di cui ha bisogno, salvo diversa indicazione. HStack accetta due parametri obbligatori: alignment (allineamento verticale, default .center) e spacing (distanza tra elementi, default nil — spaziatura di sistema). Secondo Apple Human Interface Guidelines (2025), HStack è la scelta preferita per barre di pulsanti, righe di input e elenchi orizzontali di icone.

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

In questo esempio, HStack crea una riga di tre elementi: un'icona, del testo e una freccia. Spacer() separa gli elementi — l'icona e il testo si allineano al bordo sinistro e la freccia al bordo destro. Alignment .center allinea tutti e tre gli elementi lungo l'asse centrale verticale.

VStack: layout verticale e allineamento

VStack (Vertical Stack) è un contenitore SwiftUI per disporre gli elementi figli verticalmente dall'alto verso il basso. Simile a HStack, accetta alignment (allineamento orizzontale: .leading, .center, .trailing) e spacing. VStack è la base per costruire moduli, carte, profili e elenchi di impostazioni. Secondo Apple Docs (2025), VStack insieme a LazyVStack copre l'85% degli scenari di layout verticale in SwiftUI.

Swift
VStack(alignment: .leading, spacing: 8) {
    Text("Nome ricetta")
        .font(.headline)
    Text("Tempo di preparazione: 30 min")
        .font(.subheadline)
        .foregroundColor(.secondary)
    HStack(spacing: 4) {
        Image("star.fill")
            .foregroundColor(.yellow)
        Text("4.8")
    }
}

VStack con alignment .leading allinea tutte le righe al bordo sinistro. All'interno del VStack, un HStack è annidato per la valutazione — questo è un modello tipico per costruire layout complessi attraverso stack annidati. Spacing 8 crea una spaziatura uniforme tra le righe di testo.

ZStack: sovrapposizione di elementi per profondità

ZStack (Z-axis Stack) è un contenitore SwiftUI per sovrapporre viste figlie l'una sull'altra lungo l'asse di profondità. Il primo elemento nel corpo dello ZStack viene disegnato sullo sfondo, l'ultimo — in primo piano. ZStack viene utilizzato per immagini di sfondo con testo sovrapposto, indicatori personalizzati, pulsanti overlay e animazioni di transizione. Secondo Apple Docs (2025), ZStack per impostazione predefinita allinea tutti gli elementi al centro (alignment: .center) ma supporta qualsiasi combinazione di Alignment.

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

In questo esempio, ZStack sovrappone tre strati: un'immagine di montagna, un colore nero semitrasparente per oscurare e un testo del titolo. Alignment .bottomLeading fissa il testo nell'angolo inferiore sinistro. L'oscuramento (Color.black.opacity(0.3)) migliora la leggibilità del testo sulle aree luminose dell'immagine.

HStack vs VStack vs ZStack: quando usare ciascuno

La scelta dello stack dipende dalla direzione del layout: HStack — disposizione orizzontale (pulsanti, righe di input), VStack — disposizione verticale (moduli, carte), ZStack — sovrapposizione (sfondi, overlay). Secondo Apple Human Interface Guidelines (2025), per layout complessi gli stack sono annidati l'uno dentro l'altro: un VStack esterno contiene HStack e ZStack all'interno. LazyHStack e LazyVStack sono versioni lazy per grandi collezioni.

StackAsseDefault AlignmentQuando usareVersione Lazy
HStackOrizzontale.centerBarra pulsanti, elenchi orizzontaliLazyHStack
VStackVerticale.centerModuli, profili, carteLazyVStack
ZStackProfondità (z).centerSovrapposizione, sfondi, overlay, badgeNessuna

Alignment e Spacing: regolazione fine degli stack

I parametri alignment e spacing danno il controllo completo sul posizionamento degli elementi figli negli stack SwiftUI. Alignment in HStack controlla l'allineamento verticale di elementi di diverse altezze. VStack alignment controlla l'allineamento orizzontale. Spacing imposta la distanza tra tutti gli elementi figli nello stack. Secondo SwiftUI Lab (2025), alignment può essere standard (.top, .center, .bottom) o personalizzato tramite AlignmentID.

Swift
HStack(alignment: .top, spacing: 12) {
    Text("Titolo")
        .font(.largeTitle)
    VStack(alignment: .leading) {
        Text("Sottotitolo")
        Text("Descrizione con testo aggiuntivo")
            .font(.caption)
            .foregroundColor(.gray)
    }
}
.padding()

Qui, alignment .top allinea il titolo grande e il VStack annidato lungo il bordo superiore. Spacing 12 crea una spaziatura tra di loro. Il VStack annidato con alignment .leading allinea il sottotitolo e la descrizione al bordo sinistro. La combinazione di diversi alignment all'interno di stack annidati consente un controllo preciso del layout.

Stack annidati: esempi di layout complessi

Le interfacce reali sono costruite combinando HStack, VStack e ZStack annidati. Una scheda prodotto è un esempio tipico: un VStack esterno contiene un'immagine (ZStack con overlay), un titolo (Text), una valutazione (HStack) e un prezzo. Secondo Apple Sample Projects (2025), la profondità di annidamento degli stack raramente supera i 4 livelli — un annidamento più profondo riduce la leggibilità del codice e le prestazioni.

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()

In questo esempio, VStack combina uno ZStack (immagine con un badge di sconto), un nome prodotto e un HStack (prezzo + valutazione). ZStack usa alignment .topTrailing per posizionare il badge «-20%» nell'angolo superiore destro. Spacer nell'HStack spinge il prezzo al bordo sinistro e la valutazione al bordo destro.

Domande Frequenti

Qual è la differenza tra HStack e VStack?

HStack dispone gli elementi orizzontalmente (da sinistra a destra), mentre VStack li dispone verticalmente (dall'alto verso il basso). Entrambi supportano alignment e spacing. HStack allinea verticalmente (top, center, bottom), VStack allinea orizzontalmente (leading, center, trailing). La scelta dipende dalla direzione del layout: usa HStack per righe di pulsanti e VStack per moduli.

Quando usare ZStack invece di overlay?

ZStack e overlay sono approcci diversi alla sovrapposizione. ZStack combina tutti gli elementi figli come parti uguali del layout. Overlay si attacca a una singola vista e si estende con essa. Secondo SwiftUI Lab (2025), overlay è preferibile per piccoli elementi sopra una singola vista (badge, icona), mentre ZStack è per sovrapposizioni complete multi-componente.

Come rendere gli elementi della stessa dimensione in uno stack SwiftUI?

Usa il modificatore .frame(maxWidth: .infinity) per HStack o .frame(maxHeight: .infinity) per VStack. Per rendere tutti gli elementi figli in un HStack della stessa larghezza, aggiungi .frame(maxWidth: .infinity) a ciascuno. Per VStack, usa .fixedSize(horizontal: false, vertical: true) per forzare la dimensione verticale.

Riepilogo

  • HStack — disposizione orizzontale degli elementi da sinistra a destra con parametri alignment e spacing.
  • VStack — disposizione verticale degli elementi dall'alto verso il basso, la base per moduli e carte.
  • ZStack — sovrapposizione di elementi lungo l'asse di profondità per sfondi, overlay e badge.
  • Gli stack sono annidati l'uno dentro l'altro per costruire layout complessi con una profondità massima di 4 livelli.
  • Alignment in HStack controlla l'allineamento verticale, in VStack — l'allineamento orizzontale, in ZStack — lungo tutti gli assi.
  • Spacer() all'interno degli stack crea spazi flessibili, spingendo gli elementi verso i bordi.

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche