Section в SwiftUI е контейнерен компонент за логическо групиране на елементи във Form или List. Компонентът показва съдържанието като визуален блок със системни разстояния, заоблени ъгли и опционална заглавна част и долен колонтитул. Според Apple Developer Documentation (2025), Section не управлява данни, а само организира представянето: всички дъщерни елементи наследяват нейния стил и разстояния, осигурявайки структурирано показване на формуляри и списъци.
Основни точки
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 знака". Долният колонтитул автоматично се разделя на няколко реда при необходимост.
Section(
header: Text("Сигурност на акаунта"),
footer: Text("Използвайте силна парола с поне 8 знака.")
) {
SecureField("Current password", text: $currentPassword)
SecureField("New password", text: $newPassword)
}
В примера Section има заглавна част „Сигурност на акаунта" и долен колонтитул със съвет за сигурност на паролата. Потребителят вижда заглавната част като етикет на секция, попълва две полета и веднага чете предупреждението под тях. Такава структура подобрява UX, тъй като цялата информация за секцията е на един екран без необходимост от отделна помощ.
Section работи както във Form, така и в List, но визуалното представяне се различава. Във Form Section се показва като блок с заоблени ъгли и системен фон, отделен от съседните секции с разстояния. В List Section може да използва plain стил — без фон и заобляне, или inset-grouped — със заоблени блокове, подобно на Form.
Изборът на контейнер влияе върху стила на Section. Поставянето на Section с едно и също съдържание във Form и List със стил .insetGrouped ще даде същия резултат. Въпреки това, Form добавя системни разстояния и по подразбиране използва grouped стил, докато List изисква изрично посочване на стила чрез модификатора .listStyle(.insetGrouped).
| Контейнер | Section по подразбиране | Налични стилове |
|---|---|---|
| Form | InsetGrouped със заоблени ъгли | .grouped (само Form) |
| List | Plain — без фон на секция | .plain, .inset, .insetGrouped, .sidebar |
За да постигнете същия външен вид в List, използвайте .listStyle(.insetGrouped). Този стил имитира външния вид на Form и е подходящ за екрани с настройки, изградени върху List. За стандартни списъци с данни използвайте .plain — без подчертаване на секции, с тънки разделители между редовете.
Section може да съдържа динамичен брой елементи чрез ForEach. Това позволява създаване на групи с повтарящи се елементи, като запазва заглавната част и долния колонтитул за цялата група. ForEach вътре в Section обхожда колекцията от данни и създава дъщерни View за всеки елемент, без да нарушава структурата на секцията.
Динамичните секции са полезни за екрани с настройки с променлив брой опции: списък на наличните езици за избор, списък на свързаните устройства или списък на push абонаментите. Заглавната част на секцията остава статична, докато съдържанието се променя в зависимост от данните.
struct DynamicSectionView: View {
let categories = ["Work", "Personal", "Finance", "Health"]
@State private var selected = Set<String>()
var body: some View {
Form {
Section(header: Text("Категории"),
footer: Text("Изберете предпочитаните категории")) {
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.count) категории")
.foregroundStyle(.secondary)
}
}
}
}
В този пример ForEach генерира Toggle за всяка категория от масива categories. Заглавната част и долният колонтитул на секцията се задават веднъж и важат за цялата група. Втората секция показва броя на избраните категории — не зависи от ForEach и остава статична. Този подход позволява създаване на гъвкави формуляри, където заглавната част и долният колонтитул контекстуализират групата от динамични елементи.
Нека разгледаме пълен пример на екран за профил, използващ Section за групиране на данни. Формулярът съдържа три секции: информация за потребителя, настройки за поверителност и статистика. Всяка секция използва своя заглавна част, а последната — долен колонтитул с обобщаваща информация.
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("Информация за профила")) {
TextField("Display name", text: $displayName)
TextField("Bio", text: $bio, axis: .vertical)
.lineLimit(3)
}
Section(header: Text("Поверителност")) {
Toggle("Public profile", isOn: $isProfilePublic)
Toggle("Show email", isOn: $showEmail)
.disabled(!isProfilePublic)
}
Section(header: Text("Статистика"),
footer: Text("Последно обновено днес в 14:30")) {
LabeledContent("Posts", value: "42")
LabeledContent("Followers", value: "1,280")
LabeledContent("Following", value: "346")
}
}
.navigationTitle("Profile")
}
}
Три Section ясно разделят функционалните блокове: редактируеми полета на профила, ключове за поверителност и статистика. Втората секция демонстрира валидация: Toggle „Покажи имейл" е изключен, докато профилът не стане публичен. Долният колонтитул на третата секция показва часа на последното обновяване — пример за използване на долен колонтитул за допълнителна контекстна информация. LabeledContent е стандартен компонент на SwiftUI за показване на двойка „ключ-стойност" във Form.
Section(
header: HStack {
Image(systemName: "bell.fill")
.foregroundStyle(.blue)
Text("Известия")
.font(.headline)
},
footer: Text("Управление на push и имейл известия")
) {
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 не поддържа влагане в SwiftUI. Опитът да поставите Section вътре в друга Section води до грешка при компилиране. За йерархично групиране използвайте List с OutlineGroup или DisclosureGroup вътре в Section.
Разстоянията между Section се управляват от системата и не могат да бъдат променяни чрез модификатори padding. В iOS разстоянието между секциите е 16–20 пункта и съответства на HIG. Единственият начин да повлияете на разстоянията е използването на персонализиран ListStyle, но това не се препоръчва.
Group е невидим контейнер за групиране на елементи без визуално форматиране. Section добавя заглавна част, долен колонтитул, разстояния и визуален блок. Group се използва за условно рендиране, Section — за структуриране на интерфейса.
Да, Section автоматично добавя етикети за достъпност. Заглавната част на секцията става етикет за достъпност на групата, долният колонтитул — съвет за достъпност. VoiceOver чете заглавната част преди влизане в секцията, което подобрява навигацията за потребители с увреждания.
Не, Section работи само във Form или List. Използването на Section извън тези контейнери води до грешка при компилиране. За групиране на елементи в VStack или ScrollView използвайте Group или персонализирани View с ръчно настройване на разстоянията.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също