Vom analiza ce sunt HStack, VStack și ZStack în SwiftUI — containere-stive pentru construirea interfețelor de utilizator pe toate platformele Apple. HStack aranjează elementele orizontal, VStack — vertical, ZStack — în adâncime (suprapunere). Stivele sunt baza SwiftUI: orice vedere se construiește din stive imbricate cu parametrii alignment și spacing. Conform Apple WWDC 2024, peste 90% din ecranele aplicațiilor SwiftUI folosesc o combinație a acestor trei stive.
Puncte principale
HStack (Horizontal Stack) — este un container SwiftUI care aranjează vederile copil într-o linie orizontală. Fiecare element copil ocupă atât spațiu cât are nevoie, dacă nu se specifică altfel. HStack primește doi parametri obligatorii: alignment (aliniere verticală, implicit .center) și spacing (distanța între elemente, implicit nil — distanță sistemică). Conform Apple Human Interface Guidelines (2025), HStack este alegerea preferată pentru panouri de butoane, rânduri de intrare și liste orizontale de pictograme.
HStack(alignment: .center, spacing: 16) {
Image("star")
.resizable()
.frame(width: 24, height: 24)
Text("Favorite")
.font(.body)
Spacer()
Image("chevron.right")
.foregroundColor(.gray)
}
.padding()
În acest exemplu HStack creează un rând din trei elemente: pictogramă, text și săgeată. Spacer() împinge elementele — pictograma cu textul sunt lipite de marginea stângă, iar săgeata de marginea dreaptă. Alignment .center aliniază toate cele trei elemente pe centrul axei verticale.
VStack (Vertical Stack) — este un container SwiftUI pentru aranjarea verticală a elementelor copil de sus în jos. La fel ca HStack, primește alignment (aliniere orizontală: .leading, .center, .trailing) și spacing. VStack este baza pentru construirea formularelor, cardurilor, profilurilor și listelor de setări. Conform Apple Docs (2025), VStack împreună cu LazyVStack acoperă 85% din scenariile de aranjare verticală în SwiftUI.
VStack(alignment: .leading, spacing: 8) {
Text("Numele rețetei")
.font(.headline)
Text("Timp de preparare: 30 min")
.font(.subheadline)
.foregroundColor(.secondary)
HStack(spacing: 4) {
Image("star.fill")
.foregroundColor(.yellow)
Text("4.8")
}
}
VStack cu alignment .leading aliniază toate rândurile la marginea stângă. În interiorul VStack este imbricat un HStack pentru rating — acesta este un model tipic de construire a machetelor complexe prin stive imbricate. Spacing 8 creează o distanță uniformă între rândurile de text.
ZStack (Z-axis Stack) — este un container SwiftUI pentru suprapunerea vederilor copil una peste alta pe axa de adâncime. Primul element din corpul ZStack este desenat în fundal, ultimul — în prim-plan. ZStack este folosit pentru imagini de fundal cu text deasupra, indicatoare personalizate, butoane suprapuse și animații de tranziție. Conform Apple Docs (2025), ZStack în mod implicit aliniază toate elementele în centru (alignment: .center), dar suportă orice combinații de Alignment.
ZStack(alignment: .bottomLeading) {
Image("mountains")
.resizable()
.scaledToFill()
.frame(height: 200)
.clipped()
Color.black
.opacity(0.3)
Text("Peisaj montan")
.font(.title)
.bold()
.foregroundColor(.white)
.padding()
}
În acest exemplu ZStack suprapune trei straturi: imaginea munților, culoarea neagră semitransparentă pentru întunecare și textul cu titlul. Alignment .bottomLeading lipește textul de colțul din stânga jos. Întunecarea (Color.black.opacity(0.3)) îmbunătățește lizibilitatea textului pe porțiunile luminoase ale imaginii.
Alegerea stivei depinde de direcția de aranjare: HStack — aranjare orizontală (butoane, rânduri de intrare), VStack — aranjare verticală (formulare, carduri), ZStack — suprapunere (fundaluri, suprapuneri). Conform Apple Human Interface Guidelines (2025), pentru machete complexe stivele se imbrică una în alta: VStack exterior conține HStack și ZStack în interior. LazyHStack și LazyVStack sunt versiuni leneșe pentru colecții mari.
| Stivă | Axa | Alignment Implicit | Când să folosești | Versiune leneșă |
|---|---|---|---|---|
| HStack | Orizontală | .center | Rând de butoane, liste orizontale | LazyHStack |
| VStack | Verticală | .center | Formulare, profiluri, carduri | LazyVStack |
| ZStack | Adâncime (z) | .center | Suprapunere, fundaluri, suprapuneri, ecusoane | Nu |
Parametrii alignment și spacing oferă control complet asupra amplasării elementelor copil în stivele SwiftUI. Alignment în HStack controlează alinierea verticală a elementelor de înălțimi diferite. Alignment în VStack controlează alinierea orizontală. Spacing stabilește distanța între toate elementele copil din stivă. Conform SwiftUI Lab (2025), alignment poate fi atât standard (.top, .center, .bottom), cât și personalizat prin AlignmentID.
HStack(alignment: .top, spacing: 12) {
Text("Titlu")
.font(.largeTitle)
VStack(alignment: .leading) {
Text("Subtitlu")
Text("Descriere cu text suplimentar")
.font(.caption)
.foregroundColor(.gray)
}
}
.padding()
Aici alignment .top aliniază titlul mare și VStack imbricat la marginea superioară. Spacing 12 creează distanță între ele. VStack imbricat cu alignment .leading aliniază subtitlul și descrierea la marginea stângă. Combinarea diferitelor alignment în interiorul stivelor imbricate permite controlul precis al machetei.
Interfețele reale se construiesc prin combinarea HStack, VStack și ZStack imbricate. Cardul de produs — un exemplu tipic: VStack exterior conține imaginea (ZStack cu suprapunere), titlul (Text), ratingul (HStack) și prețul. Conform Apple Sample Projects (2025), adâncimea de imbricare a stivelor depășește rareori 4 nivele — o imbricare mai adâncă reduce lizibilitatea codului și performanța.
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()
În acest exemplu VStack combină ZStack (imaginea cu ecusonul de reducere), numele produsului și HStack (preț + rating). ZStack folosește alignment .topTrailing pentru plasarea ecusonului «-20%» în colțul din dreapta sus. Spacer în HStack împinge prețul la marginea stângă și ratingul la marginea dreaptă.
Întrebări frecvente
HStack aranjează elementele orizontal (de la stânga la dreapta), VStack — vertical (de sus în jos). Ambele suportă alignment și spacing. HStack aliniază vertical (top, center, bottom), VStack — orizontal (leading, center, trailing). Alegerea depinde de direcția machetei: pentru un rând de butoane folosiți HStack, pentru un formular — VStack.
ZStack și overlay sunt abordări diferite pentru suprapunere. ZStack combină toate elementele copil ca părți egale ale machetei. Overlay se atașează unei singure vederi și se întinde odată cu ea. Conform SwiftUI Lab (2025), overlay este preferabil pentru elemente mici deasupra unei singure vederi (ecuson, pictogramă), ZStack — pentru suprapuneri complete multicomponente.
Folosiți modifierul .frame(maxWidth: .infinity) pentru HStack sau .frame(maxHeight: .infinity) pentru VStack. Pentru ca toate elementele copil dintr-un HStack să aibă aceeași lățime, adăugați fiecăruia .frame(maxWidth: .infinity). Pentru VStack — .fixedSize(horizontal: false, vertical: true) pentru dimensiune forțată pe verticală.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și