Section у SwiftUI: що це, створення секцій та групування

Автор: IT Sectr Опубліковано: 2026-06-25 Час читання: 7 хв

Section у SwiftUI — контейнерний компонент для логічного групування елементів всередині Form або List. Компонент відображає вміст як візуальний блок із системними відступами, заокругленими кутами та опціональними заголовком і футером. За даними Apple Developer Documentation (2025), Section не керує даними, а лише організовує представлення: всі дочірні елементи успадковують її стиль і відступи, забезпечуючи структуроване відображення форм і списків.

Головне

  • Section — контейнер для логічного групування елементів у Form і List
  • Заголовок Section відображається над групою елементів системним шрифтом
  • Футер додає пояснювальний текст під групою меншим шрифтом
  • ForEach всередині Section дозволяє створювати динамічні групи
  • Вкладені секції підтримуються для ієрархічної організації контенту

Що таке Section у SwiftUI?

Section — це структурний компонент SwiftUI, призначений для групування елементів всередині контейнерів Form і List. На відміну від VStack або HStack, Section додає системні відступи, заголовок і футер, а також візуальне виділення групи у вигляді блоку із заокругленими кутами на iOS.

Section не змінює поведінку дочірніх елементів — вона лише організовує їх представлення. Всі контроли всередині Section — Picker, Toggle, TextField — працюють як зазвичай, але візуально об'єднані в логічну групу. Це особливо важливо для екранних форм, де користувач повинен швидко орієнтуватися в структурі даних, що вводяться.

Система автоматично керує відступами між секціями: відстань між Section на iOS становить 16–20 пунктів, між елементами всередині Section — 0 (роздільник між рядками). Розробник не може змінити ці відступи через модифікатори padding — вони контролюються системою для забезпечення єдиного зовнішнього вигляду.

Section приймає два опціональні параметри: header — заголовок групи, і footer — пояснювальний текст під групою. Заголовок відображається над елементами секції напівжирним шрифтом caption-стилю, футер — меншим шрифтом сірим кольором. Обидва параметри приймають будь-яку SwiftUI View, не тільки Text.

Заголовок Section допомагає користувачеві зрозуміти, до якої категорії належать елементи всередині групи. Наприклад, на екрані налаштувань заголовки «Сповіщення», «Приватність» і «Акаунт» миттєво орієнтують користувача. Футер доречний для пояснень: «Вимкніть сповіщення на час зустрічі» або «Пароль повинен містити не менше 8 символів». Футер автоматично переноситься на кілька рядків при необхідності.

swift
Section(
    header: Text("Account Security"),
    footer: Text("Use a strong password with at least 8 characters.")
) {
    SecureField("Current password", text: $currentPassword)
    SecureField("New password", text: $newPassword)
}

У прикладі Section має заголовок «Account Security» і футер із порадою щодо безпеки пароля. Користувач бачить заголовок як мітку розділу, заповнює два поля і відразу читає попередження під ними. Така структура покращує UX, оскільки вся інформація про розділ знаходиться на одному екрані без необхідності переходити до окремої довідки.

Section всередині Form і List

Section працює як всередині Form, так і всередині List, але візуальне представлення відрізняється. У Form Section відображається як блок із заокругленими кутами і системним фоном, відокремлений від сусідніх секцій відступами. У List Section може використовувати стиль plain — без фону та заокруглень, або inset-grouped — із заокругленими блоками, аналогічно Form.

Вибір контейнера впливає на стиль Section. Якщо розмістити Section з однаковим вмістом всередині Form і List зі стилем .insetGrouped, результат буде ідентичним. Однак Form додає системні відступи і за замовчуванням використовує grouped-стиль, тоді як List вимагає явного вказання стилю через модифікатор .listStyle(.insetGrouped).

КонтейнерSection за замовчуваннямДоступні стилі
FormInsetGrouped із заокругленими кутами.grouped (тільки Form)
ListPlain — без фону секції.plain, .inset, .insetGrouped, .sidebar

Для досягнення однакового зовнішнього вигляду в List використовуйте .listStyle(.insetGrouped). Цей стиль імітує зовнішній вигляд Form і підходить для екранів налаштувань, побудованих на List. Для стандартних списків даних використовуйте .plain — без виділення секцій, із тонкими роздільниками між рядками.

Динамічний контент через ForEach

Section може містити динамічну кількість елементів через ForEach. Це дозволяє створювати групи з повторюваними елементами, зберігаючи заголовок і футер для всієї групи. ForEach всередині Section ітерує колекцію даних і створює дочірні View для кожного елемента, не порушуючи структуру секції.

Динамічні секції корисні для екранів налаштувань із змінною кількістю опцій: список мов, доступних для вибору, перелік підключених пристроїв або список push-підписок. Заголовок секції залишається статичним, а вміст змінюється залежно від даних.

swift
struct DynamicSectionView: View {
    let categories = ["Work", "Personal", "Finance", "Health"]
    @State private var selected = Set<String>()

    var body: some View {
        Form {
            Section(header: Text("Categories"),
                    footer: Text("Select your preferred categories")) {
                ForEach(categories, id: \.self) { category in
                    Toggle(category, isOn: Binding(
                        get: { selected.contains(category) },
                        set: { if $0 { selected.insert(category) }
                                     else { selected.remove(category) } }
                    ))
                }
            }

            Section {
                Text("Selected: \(selected.count) categories")
                    .foregroundStyle(.secondary)
            }
        }
    }
}

У цьому прикладі ForEach генерує Toggle для кожної категорії з масиву categories. Заголовок і футер секції задані один раз і застосовуються до всієї групи. Друга секція відображає кількість вибраних категорій — вона не залежить від ForEach і залишається статичною. Такий підхід дозволяє створювати гнучкі форми, де заголовок і футер контекстуалізують групу динамічних елементів.

Приклади коду Section

Розглянемо повноцінний приклад екрана профілю з використанням Section для групування даних. Форма містить три секції: інформація про користувача, налаштування приватності та статистика. Кожна секція використовує свій заголовок, а остання — футер із підсумковою інформацією.

swift
struct ProfileView: View {
    @State private var displayName = "Alex Johnson"
    @State private var bio = "iOS developer"
    @State private var isProfilePublic = true
    @State private var showEmail = false

    var body: some View {
        Form {
            Section(header: Text("Profile Info")) {
                TextField("Display name", text: $displayName)
                TextField("Bio", text: $bio, axis: .vertical)
                    .lineLimit(3)
            }

            Section(header: Text("Privacy")) {
                Toggle("Public profile", isOn: $isProfilePublic)
                Toggle("Show email", isOn: $showEmail)
                    .disabled(!isProfilePublic)
            }

            Section(header: Text("Stats"),
                    footer: Text("Last updated today at 2:30 PM")) {
                LabeledContent("Posts", value: "42")
                LabeledContent("Followers", value: "1,280")
                LabeledContent("Following", value: "346")
            }
        }
        .navigationTitle("Profile")
    }
}

Три Section чітко розділяють функціональні блоки: редаговані поля профілю, перемикачі приватності та статистику. Друга секція демонструє валідацію: Toggle «Show email» вимкнено, поки профіль не публічний. Футер третьої секції показує час останнього оновлення — приклад використання футера для додаткової контекстної інформації. LabeledContent — стандартний компонент SwiftUI для відображення пари «ключ-значення» у Form.

Section з кастомним заголовком

swift
Section(
    header: HStack {
        Image(systemName: "bell.fill")
            .foregroundStyle(.blue)
        Text("Notifications")
            .font(.headline)
    },
    footer: Text("Manage push and email alerts")
) {
    Toggle("Push notifications", isOn: $push)
    Toggle("Email notifications", isOn: $email)
    Stepper("Quiet hours: \(quietStart) — \(quietEnd)",
            value: $quietStart,
            in: 0...23)
}

Цей приклад показує, що header може бути будь-якою SwiftUI View. Використання HStack із Image і Text дозволяє додати іконку поруч із заголовком, роблячи секцію візуально більш виразною. Кастомні заголовки корисні для виділення важливих розділів в інтерфейсі: налаштування сповіщень, платні функції або розділи з попередженнями. Однак зловживати кастомними заголовками не варто — на кожному екрані достатньо 1–2 секцій з нестандартним оформленням, щоб зберегти єдність інтерфейсу.

Часті запитання

Чи можна вкладати Section одна в одну?

Ні, Section не підтримує вкладеність у SwiftUI. Спроба помістити Section всередину іншої Section призводить до помилки компіляції. Для ієрархічного групування використовуйте List з OutlineGroup або DisclosureGroup всередині Section.

Як змінити відступи між Section?

Відступи між Section керуються системою і не можуть бути змінені через модифікатори padding. На iOS відстань між секціями становить 16–20 пунктів і відповідає HIG. Єдиний спосіб вплинути на відступи — використовувати кастомний ListStyle, але це не рекомендується.

Чим Section відрізняється від Group у SwiftUI?

Group — невидимий контейнер для групування елементів без візуального оформлення. Section додає заголовок, футер, відступи та візуальний блок. Group використовується для умовного рендерингу, Section — для структурування інтерфейсу.

Чи підтримує Section Accessibility?

Так, Section автоматично додає accessibility-мітки. Заголовок секції стає accessibility-заголовком групи, футер — accessibility-підказкою. VoiceOver читає заголовок перед входом у секцію, що покращує навігацію для користувачів з обмеженими можливостями.

Чи можна використовувати Section без Form або List?

Ні, Section працює тільки всередині Form або List. Використання Section поза цими контейнерами призводить до помилки компіляції. Для групування елементів у VStack або ScrollView використовуйте Group або кастомні View з налаштуванням відступів вручну.

Підсумки

  • Section — контейнер групування елементів у Form і List із системними відступами
  • Header і footer — опціональні параметри для контекстної інформації про групу
  • ForEach всередині Section дозволяє створювати динамічні групи з повторюваними елементами
  • Вкладеність Section заборонена — для підгруп використовуйте DisclosureGroup
  • Стиль Section залежить від контейнера: Form використовує insetGrouped, List — plain за замовчуванням
  • Кастомний header може бути будь-якою SwiftUI View з іконкою та кастомним шрифтом
  • Використовуйте Section для логічного групування полів введення та налаштувань

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

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