Stos głębi, który wyświetla elementy, w kolejności od początku do końca. Na przykład mając trzy elementy, które są takich samych rozmiarów, ten ostatni zostanie wyświetlony jako widoczny, a resztę przykryje.
Stos daje także możliwość na sposób wyświetlania elementów poprzez wyrównanie (ang.: alignment) oraz na ustawienie odstępów między elementami (ang.: spacing).
Wyrównanie
Jeśli chodzi o wyrównanie, użyj właściwości: alignment.
Przy czym, każdy stos przyjmuje własne wartości:
Dla VStack:
.leading — wyrówanie do lewej
.center — wyrównanie do środka (domyślna wartość)
.trailing — wyrównanie do prawej
VStack(alignment: .leading)
Dla HStack:
.top — umieszcza elementy na górze stosu
.bottom — umieszcza elementy na dole stosu
.center — umieszcza elementy na środku
HStack(alignment: .leading)
Dla ZStack:
Przyjmuje takie same wartości jak dla VStack i HStack, np: leading lub top
Lub kombinacje: topLeading, topTrailing, bottomLeading, bottomTrailing
Odstęp
Żeby ustawić odpowiedni odstęp między elementami stosu, użyj właściwości: spacing.
Ten wrapper służy do wymiany danych między wieloma widokami. Jest to szczególnie przydatne kiedy jeden widok składa się z wielu innych i na przykład do niektórych z nich musimy przekazać jakieś dane.
Przekazywanie danych z jednego widoku do drugiego, aż w końcu trafimy na ten, w którym te dane są potrzebne, staje się męczące. Ten problem rozwiązuje @EnvironmentObject.
Masz także gwarancję, że jeśli dane się zmienią, widok zostanie automatycznie o tym poinformowany.
Aby przejąć dane oznaczone przez @EnvironmentObject, będziesz musiał w widoku, który znajduje się wyżej w hierarchii wywołać metodę environmentObject i przekazać do niej obiekt, którym chcesz się dzielić z innymi widokami.
Najlepiej wszystko zobrazuje poniższy przykład.
Przykład
Mamy jeden model o nazwie Counter.
Trzy widoki w takiej hierarchii: ContentView -> InformationView -> CounterLabelView.
Widok CounterLabelView potrzebuje mieć dostęp do obiektu klasy Counter. Dlatego w tym widoku zostanie użyty @EnvironmentObject, aby przechwycić przesłane dane.
W widoku InformationView niepotrzebny jest obiekt klasy Counter. Zawiera on widok CounterLabelView.
W widoku głównym ContentView wywołujemy metodę environmentObject, żeby przekazać instancję klasy Counter do widoków potomnych.
Model:
import SwiftUI
classCounter: ObservableObject{
@Publishedvar value: Int = 0funcincrement() {
value += 1
}
funcdecrement() {
value -= 1
}
funcreset() {
value = 0
}
}