HStack: что это, HStack VStack ZStack в SwiftUI

Автор: IT Sectr Опубликовано: 2026-02-24 Время чтения: 7 мин

Разберём, что такое HStack, VStack и ZStack в SwiftUI — контейнеры-стеки для построения пользовательских интерфейсов на всех платформах Apple. HStack располагает элементы горизонтально, VStack — вертикально, ZStack — в глубину (наложение). Стеки — основа SwiftUI: любое представление строится из вложенных стеков с параметрами alignment и spacing. По данным Apple WWDC 2024, более 90% экранов в приложениях на SwiftUI используют комбинацию этих трёх стеков.

Главное

  • HStack — горизонтальный стек SwiftUI, располагающий дочерние элементы в ряд слева направо.
  • VStack — вертикальный стек SwiftUI, располагающий элементы сверху вниз с настройкой выравнивания.
  • ZStack — стек глубины SwiftUI для наложения элементов друг на друга по z-оси.
  • Все три стека поддерживают параметры alignment (выравнивание) и spacing (отступ между элементами).
  • По данным Apple Docs (2025), стеки автоматически подстраиваются под контент, но могут растягиваться на всё доступное пространство с помощью frame(maxWidth: .infinity).

Что такое HStack в SwiftUI?

HStack (Horizontal Stack) — это контейнер SwiftUI, который располагает дочерние представления в горизонтальной линии. Каждый дочерний элемент занимает столько места, сколько ему нужно, если не указано иное. HStack принимает два обязательных параметра: alignment (выравнивание по вертикали, по умолчанию .center) и spacing (расстояние между элементами, по умолчанию nil — системный отступ). По данным Apple Human Interface Guidelines (2025), HStack — предпочтительный выбор для панелей кнопок, строк ввода и горизонтальных списков иконок.

Swift
HStack(alignment: .center, spacing: 16) {
    Image("star")
        .resizable()
        .frame(width: 24, height: 24)
    Text("Избранное")
        .font(.body)
    Spacer()
    Image("chevron.right")
        .foregroundColor(.gray)
}
.padding()

В этом примере HStack создаёт строку из трёх элементов: иконка, текст и стрелка. Spacer() раздвигает элементы — иконка с текстом прижимаются к левому краю, а стрелка к правому. Alignment .center выравнивает все три элемента по центру вертикальной оси.

VStack: вертикальное расположение и выравнивание

VStack (Vertical Stack) — это контейнер SwiftUI для вертикального расположения дочерних элементов сверху вниз. Аналогично HStack, он принимает alignment (выравнивание по горизонтали: .leading, .center, .trailing) и spacing. VStack — основа построения форм, карточек, профилей и списков настроек. По данным Apple Docs (2025), VStack в паре с LazyVStack покрывает 85% сценариев вертикальной компоновки в SwiftUI.

Swift
VStack(alignment: .leading, spacing: 8) {
    Text("Название рецепта")
        .font(.headline)
    Text("Время приготовления: 30 мин")
        .font(.subheadline)
        .foregroundColor(.secondary)
    HStack(spacing: 4) {
        Image("star.fill")
            .foregroundColor(.yellow)
        Text("4.8")
    }
}

VStack с alignment .leading выравнивает все строки по левому краю. Внутри VStack вложен HStack для рейтинга — это типичный паттерн построения сложных макетов через вложенные стеки. Spacing 8 создаёт равномерный отступ между строками текста.

ZStack: наложение элементов по глубине

ZStack (Z-axis Stack) — это контейнер SwiftUI для наложения дочерних представлений друг на друга по оси глубины. Первый элемент в теле ZStack рисуется на заднем плане, последний — на переднем. ZStack используется для фоновых изображений с текстом поверх, кастомных индикаторов, оверлейных кнопок и анимаций переходов. По данным Apple Docs (2025), ZStack по умолчанию выравнивает все элементы по центру (alignment: .center), но поддерживает любые комбинации Alignment.

Swift
ZStack(alignment: .bottomLeading) {
    Image("mountains")
        .resizable()
        .scaledToFill()
        .frame(height: 200)
        .clipped()
    Color.black
        .opacity(0.3)
    Text("Горный пейзаж")
        .font(.title)
        .bold()
        .foregroundColor(.white)
        .padding()
}

В этом примере ZStack накладывает три слоя: изображение гор, полупрозрачный чёрный цвет для затемнения и текст с заголовком. Alignment .bottomLeading прижимает текст к нижнему левому углу. Затемнение (Color.black.opacity(0.3)) улучшает читаемость текста на светлых участках изображения.

Сравнение HStack, VStack и ZStack: когда какой использовать

Выбор стека зависит от направления компоновки: HStack — горизонтальное расположение (кнопки, строки ввода), VStack — вертикальное (формы, карточки), ZStack — наложение (фоны, оверлеи). По данным Apple Human Interface Guidelines (2025), для сложных макетов стеки вкладываются друг в друга: внешний VStack содержит HStack и ZStack внутри. LazyHStack и LazyVStack — ленивые версии для больших коллекций.

СтекОсьDefault AlignmentКогда использоватьЛенивая версия
HStackГоризонтальная.centerСтрока кнопок, горизонтальные спискиLazyHStack
VStackВертикальная.centerФормы, профили, карточкиLazyVStack
ZStackГлубина (z).centerНаложение, фоны, оверлеи, бейджиНет

Alignment и Spacing: тонкая настройка стеков

Параметры alignment и spacing дают полный контроль над расположением дочерних элементов в стеках SwiftUI. Alignment в HStack управляет вертикальным выравниванием элементов разной высоты. VStack alignment управляет горизонтальным выравниванием. Spacing задаёт расстояние между всеми дочерними элементами в стеке. По данным SwiftUI Lab (2025), alignment может быть как стандартным (.top, .center, .bottom), так и кастомным через AlignmentID.

Swift
HStack(alignment: .top, spacing: 12) {
    Text("Заголовок")
        .font(.largeTitle)
    VStack(alignment: .leading) {
        Text("Подзаголовок")
        Text("Описание с дополнительным текстом")
            .font(.caption)
            .foregroundColor(.gray)
    }
}
.padding()

Здесь alignment .top выравнивает большой заголовок и вложенный VStack по верхней границе. Spacing 12 создаёт отступ между ними. Вложенный VStack с alignment .leading выравнивает подзаголовок и описание по левому краю. Комбинация разных alignment внутри вложенных стеков позволяет точно контролировать макет.

Вложенные стеки: примеры построения сложных макетов

Реальные интерфейсы строятся комбинацией вложенных HStack, VStack и ZStack. Карточка товара — типичный пример: внешний VStack содержит изображение (ZStack с оверлеем), заголовок (Text), рейтинг (HStack) и цену. По данным Apple Sample Projects (2025), глубина вложенности стеков редко превышает 4 уровня — более глубокая вложенность снижает читаемость кода и производительность.

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("Смартфон Model X")
        .font(.headline)
    HStack(spacing: 8) {
        Text("$999")
            .font(.title2)
            .bold()
        Spacer()
        Image("star.fill")
            .foregroundColor(.yellow)
        Text("4.7")
    }
}
.padding()

В этом примере VStack объединяет ZStack (изображение со скидочным бейджем), название товара и HStack (цена + рейтинг). ZStack использует alignment .topTrailing для размещения бейджа «-20%» в правом верхнем углу. Spacer в HStack раздвигает цену к левому краю, а рейтинг к правому.

Часто задаваемые вопросы

В чём разница между HStack и VStack?

HStack располагает элементы горизонтально (слева направо), VStack — вертикально (сверху вниз). Оба поддерживают alignment и spacing. HStack выравнивает по вертикали (top, center, bottom), VStack — по горизонтали (leading, center, trailing). Выбор зависит от направления макета: для строки кнопок используйте HStack, для формы — VStack.

Когда использовать ZStack вместо overlay?

ZStack и overlay — разные подходы к наложению. ZStack объединяет все дочерние элементы как равноправные части макета. Overlay присоединяется к одному представлению и растягивается вместе с ним. По данным SwiftUI Lab (2025), overlay предпочтительнее для небольших элементов поверх одного представления (бейдж, иконка), ZStack — для полноценных многокомпонентных наложений.

Как сделать одинаковый размер элементов в стеке SwiftUI?

Используйте модификатор .frame(maxWidth: .infinity) для HStack или .frame(maxHeight: .infinity) для VStack. Чтобы все дочерние элементы в HStack были одинаковой ширины, добавьте каждому .frame(maxWidth: .infinity). Для VStack — .fixedSize(horizontal: false, vertical: true) для принудительного размера по вертикали.

Итоги

  • HStack — горизонтальное расположение элементов слева направо с параметрами alignment и spacing.
  • VStack — вертикальное расположение элементов сверху вниз, основа для форм и карточек.
  • ZStack — наложение элементов по оси глубины для фонов, оверлеев и бейджей.
  • Стеки вкладываются друг в друга для построения сложных макетов с максимальной глубиной 4 уровня.
  • Alignment в HStack управляет вертикальным выравниванием, в VStack — горизонтальным, в ZStack — по всем осям.
  • Spacer() внутри стеков создаёт гибкие промежутки, прижимая элементы к краям.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также