HStack: co to, HStack VStack ZStack w SwiftUI

Autor: IT Sectr Opublikowano: 2026-02-24 Czas czytania: 7 min

Omówimy, czym są HStack, VStack i ZStack w SwiftUI — kontenery-stosy do budowania interfejsów użytkownika na wszystkich platformach Apple. HStack umieszcza elementy poziomo, VStack — pionowo, ZStack — w głębi (nakładanie). Stosy to podstawa SwiftUI: każdy widok buduje się z zagnieżdżonych stosów z parametrami alignment i spacing. Według Apple WWDC 2024, ponad 90% ekranów w aplikacjach SwiftUI korzysta z kombinacji tych trzech stosów.

Najważniejsze

  • HStack — poziomy stos SwiftUI, umieszczający elementy potomne w rzędzie od lewej do prawej.
  • VStack — pionowy stos SwiftUI, umieszczający elementy od góry do dołu z ustawieniem wyrównania.
  • ZStack — stos głębi SwiftUI do nakładania elementów na siebie w osi Z.
  • Wszystkie trzy stosy obsługują parametry alignment (wyrównanie) i spacing (odstęp między elementami).
  • Według Apple Docs (2025), stosy automatycznie dopasowują się do treści, ale mogą rozciągać się na całe dostępne miejsce za pomocą frame(maxWidth: .infinity).

Czym jest HStack w SwiftUI?

HStack (Horizontal Stack) — to kontener SwiftUI, który umieszcza widoki potomne w poziomym rzędzie. Każdy element potomny zajmuje tyle miejsca, ile potrzebuje, chyba że określono inaczej. HStack przyjmuje dwa obowiązkowe parametry: alignment (wyrównanie pionowe, domyślnie .center) i spacing (odległość między elementami, domyślnie nil — odstęp systemowy). Według Apple Human Interface Guidelines (2025), HStack to preferowany wybór dla paneli przycisków, wierszy wprowadzania i poziomych list ikon.

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

W tym przykładzie HStack tworzy wiersz z trzech elementów: ikona, tekst i strzałka. Spacer() rozsuwa elementy — ikona z tekstem są dociskane do lewej krawędzi, a strzałka do prawej. Alignment .center wyrównuje wszystkie trzy elementy względem osi pionowej.

VStack: układ pionowy i wyrównanie

VStack (Vertical Stack) — to kontener SwiftUI do pionowego układania elementów potomnych od góry do dołu. Podobnie jak HStack, przyjmuje alignment (wyrównanie poziome: .leading, .center, .trailing) i spacing. VStack to podstawa budowania formularzy, kart, profili i list ustawień. Według Apple Docs (2025), VStack w parze z LazyVStack pokrywa 85% scenariuszy układu pionowego w SwiftUI.

Swift
VStack(alignment: .leading, spacing: 8) {
    Text("Nazwa przepisu")
        .font(.headline)
    Text("Czas przygotowania: 30 min")
        .font(.subheadline)
        .foregroundColor(.secondary)
    HStack(spacing: 4) {
        Image("star.fill")
            .foregroundColor(.yellow)
        Text("4.8")
    }
}

VStack z alignment .leading wyrównuje wszystkie wiersze do lewej krawędzi. Wewnątrz VStack zagnieżdżono HStack dla oceny — to typowy wzorzec budowania złożonych układów przez zagnieżdżone stosy. Spacing 8 tworzy równomierny odstęp między wierszami tekstu.

ZStack: nakładanie elementów w głębi

ZStack (Z-axis Stack) — to kontener SwiftUI do nakładania widoków potomnych na siebie w osi głębi. Pierwszy element w ciele ZStack rysowany jest w tle, ostatni — na pierwszym planie. ZStack jest używany do obrazów tła z tekstem na wierzchu, niestandardowych wskaźników, przycisków nakładanych i animacji przejść. Według Apple Docs (2025), ZStack domyślnie wyrównuje wszystkie elementy do środka (alignment: .center), ale obsługuje dowolne kombinacje Alignment.

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

W tym przykładzie ZStack nakłada trzy warstwy: obraz gór, półprzezroczysty czarny kolor do przyciemnienia i tekst z tytułem. Alignment .bottomLeading dociska tekst do lewego dolnego rogu. Przyciemnienie (Color.black.opacity(0.3)) poprawia czytelność tekstu na jasnych fragmentach obrazu.

Porównanie HStack, VStack i ZStack: kiedy którego użyć

Wybór stosu zależy od kierunku układu: HStack — układ poziomy (przyciski, wiersze wprowadzania), VStack — układ pionowy (formularze, karty), ZStack — nakładanie (tła, nakładki). Według Apple Human Interface Guidelines (2025), w złożonych układach stosy są zagnieżdżane: zewnętrzny VStack zawiera wewnątrz HStack i ZStack. LazyHStack i LazyVStack to leniwe wersje dla dużych kolekcji.

StosDomyślny AlignmentKiedy używaćLeniwa wersja
HStackPozioma.centerWiersz przycisków, listy poziomeLazyHStack
VStackPionowa.centerFormularze, profile, kartyLazyVStack
ZStackGłębia (z).centerNakładanie, tła, nakładki, znaczkiBrak

Alignment i Spacing: precyzyjna konfiguracja stosów

Parametry alignment i spacing dają pełną kontrolę nad rozmieszczeniem elementów potomnych w stosach SwiftUI. Alignment w HStack zarządza pionowym wyrównaniem elementów o różnej wysokości. Alignment w VStack zarządza poziomym wyrównaniem. Spacing określa odległość między wszystkimi elementami potomnymi w stosie. Według SwiftUI Lab (2025), alignment może być zarówno standardowy (.top, .center, .bottom), jak i niestandardowy przez AlignmentID.

Swift
HStack(alignment: .top, spacing: 12) {
    Text("Nagłówek")
        .font(.largeTitle)
    VStack(alignment: .leading) {
        Text("Podtytuł")
        Text("Opis z dodatkowym tekstem")
            .font(.caption)
            .foregroundColor(.gray)
    }
}
.padding()

Tutaj alignment .top wyrównuje duży tytuł i zagnieżdżony VStack względem górnej krawędzi. Spacing 12 tworzy odstęp między nimi. Zagnieżdżony VStack z alignment .leading wyrównuje podtytuł i opis do lewej krawędzi. Kombinacja różnych alignment wewnątrz zagnieżdżonych stosów pozwala precyzyjnie kontrolować układ.

Zagnieżdżone stosy: przykłady budowania złożonych układów

Rzeczywiste interfejsy buduje się przez kombinację zagnieżdżonych HStack, VStack i ZStack. Karta produktu — typowy przykład: zewnętrzny VStack zawiera obraz (ZStack z nakładką), tytuł (Text), ocenę (HStack) i cenę. Według Apple Sample Projects (2025), głębokość zagnieżdżenia stosów rzadko przekracza 4 poziomy — głębsze zagnieżdżenie zmniejsza czytelność kodu i wydajność.

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("Smartfon Model X")
        .font(.headline)
    HStack(spacing: 8) {
        Text("$999")
            .font(.title2)
            .bold()
        Spacer()
        Image("star.fill")
            .foregroundColor(.yellow)
        Text("4.7")
    }
}
.padding()

W tym przykładzie VStack łączy ZStack (obraz ze znacznikiem rabatowym), nazwę produktu i HStack (cena + ocena). ZStack używa alignment .topTrailing do umieszczenia znaczka «-20%» w prawym górnym rogu. Spacer w HStack rozsuwa cenę do lewej krawędzi, a ocenę do prawej.

Często zadawane pytania

Jaka jest różnica między HStack a VStack?

HStack umieszcza elementy poziomo (od lewej do prawej), VStack — pionowo (od góry do dołu). Oba obsługują alignment i spacing. HStack wyrównuje pionowo (top, center, bottom), VStack — poziomo (leading, center, trailing). Wybór zależy od kierunku układu: dla wiersza przycisków użyj HStack, dla formularza — VStack.

Kiedy używać ZStack zamiast overlay?

ZStack i overlay — różne podejścia do nakładania. ZStack łączy wszystkie elementy potomne jako równoprawne części układu. Overlay dołącza się do jednego widoku i rozciąga się wraz z nim. Według SwiftUI Lab (2025), overlay jest preferowany dla małych elementów na pojedynczym widoku (znaczek, ikona), ZStack — dla pełnowartościowych wieloskładnikowych nakładek.

Jak zrobić jednakowy rozmiar elementów w stosie SwiftUI?

Użyj modyfikatora .frame(maxWidth: .infinity) dla HStack lub .frame(maxHeight: .infinity) dla VStack. Aby wszystkie elementy potomne w HStack miały jednakową szerokość, dodaj każdemu .frame(maxWidth: .infinity). Dla VStack — .fixedSize(horizontal: false, vertical: true) dla wymuszonego rozmiaru w pionie.

Podsumowanie

  • HStack — poziome rozmieszczenie elementów od lewej do prawej z parametrami alignment i spacing.
  • VStack — pionowe rozmieszczenie elementów od góry do dołu, podstawa dla formularzy i kart.
  • ZStack — nakładanie elementów w osi głębi dla tła, nakładek i znaczków.
  • Stosy zagnieżdża się w sobie nawzajem do budowania złożonych układów o maksymalnej głębokości 4 poziomów.
  • Alignment w HStack zarządza wyrównaniem pionowym, w VStack — poziomym, w ZStack — we wszystkich osiach.
  • Spacer() wewnątrz stosów tworzy elastyczne przerwy, dociskając elementy do krawędzi.

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również