SwiftUI, работа со стэками
Источник 1 : Using Stacks to Arrange Views Источник 2 : Working with Stacks in SwiftUI
Работа в классе:
Введение:
Стэки что это такое?
Стэк это коллекция Видов SwiftUI которые сгруппированы вместе.
Всего, в SwiftUI существует три вида стоков:
VStack
, вертикальный стэк, который организовывает виды сверху-вниз.HStack
, горизонтальный стэк, который организовывает виды слева-направо.ZStack
, порядковый стэк, который организовывает виды по порядку отрисовки.
Вот пример использования стэков:
Атрибуты стэков
Стэки в SwiftUI имеют два главнейших атрибута: их выравнивание и шаг. Из-за того, что стэки по сути своей являются коробками, в которые программисты помещают свои виды, важно иметь возможность разместить виды в ней тем образом, который нам необходим.
При создании VStack
или HStack
, вы можете указать значения для параметров alignment
и/или spacing
следующим образом:
VStack(alignment: .center, spacing: 5) {
Параметр alignment
берет свои значения у структур HorizontalAlignment
и VerticalAlignment
structs, для VStack
и HStack
соответственно. В инициализаторе стэка, оба параметра не обязательно указывать, но вы можете включить и оба и о отдельности параметры alignment
и spacing
.
Параметр spacing
определяет расстояние между подвидами в стэке в points. Значение отступа имеет тип Double
, то-есть оно дробное, но вы можете также указывать и целые значения.
Доступные значения для выравнивания:
Существуют следующие варианты выравнивания подвидов в стэках:
- HStack:
.top
– “приклеивает” подвиды к верхней границе стэка..bottom
– приклеивает подвиды к нижней границе стэка..center
– размещает подвиды по центру стэка (по умолчанию).
- VStack:
.leading
– выравнивает по левому краю (LTR).center
– выравнивает по центру (по умолчанию).trailing
– выравнивает по правому краю (LTR)
- ZStack:
- Можно совмещать горизонтальные и вертикальные выравнивания:
.leading
+.bottom
- Можно использовать их вместе:
.leadingBottom
- Можно совмещать горизонтальные и вертикальные выравнивания:
Пример выравниваний, размещенный в таблице.
.topLeading |
.top |
.topTrailing |
---|---|---|
.leading |
.center |
.trailing |
.bottomLeading |
.bottom |
.bottomTrailing |
Практикум:
Расположение по стэкам:
Начнем с кода, который мы написали на прошлом уроке:
import SwiftUI
import PlaygroundSupport
struct ContentView: View{
var body: some View {
VStack {
ProgressView(value: 5, total: 15)
}
}
}
PlaygroundPage.current.setLiveView(ContentView())
Если мы к нему добавим
HStack {
Text("Seconds Elapsed")
}
Чтобы у вас получилось
import SwiftUI
import PlaygroundSupport
struct ContentView: View{
var body: some View {
VStack {
ProgressView(value: 5, total: 15)
HStack {
Text("Seconds Elapsed")
}
}
}
}
PlaygroundPage.current.setLiveView(ContentView())
После ProgressView()
, то у нас должно получиться что-то вроде этого:
Попробуйте добавить текст Seconds Remaining
под ProgressView()
Теперь задание посложнее: под каждым текстом с секундами надо добавить Label
Label - подвид, состоящий из картинки и следующим за ней текстом.
Добавьте Label("300", systemImage: "hourglass.bottomhalf.fill")
под Seconds Elapsed
, а Label("600", systemImage: "hourglass.tophalf.fill")
под Seconds Remaining
.
Чтобы у вас получилось следующее:
Код для справки:
struct ContentView: View {
var body: some View {
VStack {
ProgressView(value: 5, total: 15)
HStack {
VStack {
Text("Seconds Elapsed")
Label("300", systemImage: "hourglass.bottomhalf.fill")
}
VStack {
Text("Seconds Remaining")
Label("600", systemImage: "hourglass.tophalf.fill")
}
}
}
}
}
Выравнивание:
Для начала давайте вставим Spacer()
между вертикальными стэками под строкой прогресса.
Spacer() - подвид, занимающий все свободное пространство между подвидами, между которых он установлен.
В горизонтальном стэке он занимает горизонтальное пространство, а в вертикальном стэке - вертикальное.
А потом попробуйте поиграться с выравниванием у вертикальных стэков с объектами Text
и Label
.
В конце вашей работы должно получиться следующее:
Как успехи?
Как вы думаете какую часть интерфейса мы с вами уже успели сделать???