Section ve SwiftUI: co to je, vytváření sekcí a seskupování

Autor: IT Sectr Publikováno: 2026-06-25 Doba čtení: 7 min

Section ve SwiftUI je kontejnerová komponenta pro logické seskupování prvků uvnitř Form nebo List. Komponenta zobrazuje obsah jako vizuální blok se systémovými mezerami, zaoblenými rohy a volitelným záhlavím a zápatím. Podle Apple Developer Documentation (2025), Section nespravuje data, pouze organizuje prezentaci: všechny podřízené prvky dědí její styl a mezery, což zajišťuje strukturované zobrazení formulářů a seznamů.

Hlavní body

  • Section — kontejner pro logické seskupování prvků v Form a List
  • Záhlaví Section se zobrazuje nad skupinou prvků systémovým písmem
  • Zápatí přidává vysvětlující text pod skupinu menším písmem
  • ForEach uvnitř Section umožňuje vytvářet dynamické skupiny
  • Vnořené sekce jsou podporovány pro hierarchickou organizaci obsahu

Co je Section ve SwiftUI?

Section je strukturální komponenta SwiftUI určená pro seskupování prvků uvnitř kontejnerů Form a List. Na rozdíl od VStack nebo HStack přidává Section systémové mezery, záhlaví a zápatí a také vizuální zvýraznění skupiny jako bloku se zaoblenými rohy na iOS.

Section nemění chování podřízených prvků — pouze organizuje jejich prezentaci. Všechny ovládací prvky uvnitř Section — Picker, Toggle, TextField — fungují normálně, ale jsou vizuálně sjednoceny do logické skupiny. To je důležité zejména pro obrazovky formulářů, kde se uživatel musí rychle orientovat ve struktuře zadávaných dat.

Systém automaticky spravuje mezery mezi sekcemi: vzdálenost mezi Section na iOS je 16–20 bodů, mezi prvky uvnitř Section — 0 (oddělovač mezi řádky). Vývojář nemůže tyto mezery změnit pomocí modifikátorů padding — jsou řízeny systémem pro zajištění jednotného vzhledu.

Section přijímá dva volitelné parametry: header — záhlaví skupiny, a footer — vysvětlující text pod skupinou. Záhlaví se zobrazuje nad prvky sekce tučným písmem ve stylu caption, zápatí — menším písmem šedé barvy. Oba parametry přijímají jakékoli SwiftUI View, nejen Text.

Záhlaví Section pomáhá uživateli pochopit, do které kategorie prvky ve skupině patří. Například na obrazovce nastavení záhlaví „Oznámení", „Soukromí" a „Účet" uživatele okamžitě orientují. Zápatí je vhodné pro vysvětlení: „Vypněte oznámení během schůzky" nebo „Heslo musí obsahovat alespoň 8 znaků". Zápatí se v případě potřeby automaticky rozdělí do více řádků.

swift
Section(
    header: Text("Zabezpečení účtu"),
    footer: Text("Použijte silné heslo o délce alespoň 8 znaků.")
) {
    SecureField("Current password", text: $currentPassword)
    SecureField("New password", text: $newPassword)
}

V příkladu má Section záhlaví „Zabezpečení účtu" a zápatí s radou pro bezpečnost hesla. Uživatel vidí záhlaví jako štítek sekce, vyplní dvě pole a okamžitě si přečte varování pod nimi. Taková struktura zlepšuje UX, protože všechny informace o sekci jsou na jedné obrazovce bez nutnosti přecházet do samostatné nápovědy.

Section uvnitř Form a List

Section funguje jak uvnitř Form, tak uvnitř List, ale vizuální reprezentace se liší. Ve Form se Section zobrazuje jako blok s zaoblenými rohy a systémovým pozadím, oddělený od sousedních sekcí mezerami. V List může Section použít styl plain — bez pozadí a zaoblení, nebo inset-grouped — se zaoblenými bloky, podobně jako Form.

Výběr kontejneru ovlivňuje styl Section. Umístění Section se stejným obsahem do Form a List se stylem .insetGrouped poskytne stejný výsledek. Nicméně Form přidává systémové mezery a standardně používá grouped styl, zatímco List vyžaduje explicitní určení stylu pomocí modifikátoru .listStyle(.insetGrouped).

KontejnerSection výchozíDostupné styly
FormInsetGrouped se zaoblenými rohy.grouped (pouze Form)
ListPlain — bez pozadí sekce.plain, .inset, .insetGrouped, .sidebar

Pro dosažení stejného vzhledu v List použijte .listStyle(.insetGrouped). Tento styl napodobuje vzhled Form a je vhodný pro obrazovky nastavení postavené na List. Pro standardní seznamy dat použijte .plain — bez zvýraznění sekcí, s tenkými oddělovači mezi řádky.

Dynamický obsah pomocí ForEach

Section může obsahovat dynamický počet prvků pomocí ForEach. To umožňuje vytvářet skupiny s opakujícími se prvky při zachování záhlaví a zápatí pro celou skupinu. ForEach uvnitř Section iteruje kolekci dat a vytváří podřízené Views pro každý prvek, aniž by narušil strukturu sekce.

Dynamické sekce jsou užitečné pro obrazovky nastavení s proměnným počtem možností: seznam dostupných jazyků k výběru, seznam připojených zařízení nebo seznam push předplatných. Záhlaví sekce zůstává statické, zatímco obsah se mění v závislosti na datech.

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

    var body: some View {
        Form {
            Section(header: Text("Kategorie"),
                    footer: Text("Vyberte preferované kategorie")) {
                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("Vybráno: \(selected.count) kategorií")
                    .foregroundStyle(.secondary)
            }
        }
    }
}

V tomto příkladu ForEach generuje Toggle pro každou kategorii z pole categories. Záhlaví a zápatí sekce jsou nastaveny jednou a platí pro celou skupinu. Druhá sekce zobrazuje počet vybraných kategorií — nezávisí na ForEach a zůstává statická. Tento přístup umožňuje vytvářet flexibilní formuláře, kde záhlaví a zápatí kontextualizují skupinu dynamických prvků.

Příklady kódu Section

Podívejme se na úplný příklad obrazovky profilu s použitím Section pro seskupování dat. Formulář obsahuje tři sekce: informace o uživateli, nastavení soukromí a statistiky. Každá sekce používá vlastní záhlaví a poslední — zápatí se souhrnnými informacemi.

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("Info o profilu")) {
                TextField("Display name", text: $displayName)
                TextField("Bio", text: $bio, axis: .vertical)
                    .lineLimit(3)
            }

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

            Section(header: Text("Statistiky"),
                    footer: Text("Poslední aktualizace dnes ve 14:30")) {
                LabeledContent("Posts", value: "42")
                LabeledContent("Followers", value: "1,280")
                LabeledContent("Following", value: "346")
            }
        }
        .navigationTitle("Profile")
    }
}

Tři Section jasně oddělují funkční bloky: editovatelná pole profilu, přepínače soukromí a statistiky. Druhá sekce demonstruje validaci: Toggle „Zobrazit email" je vypnutý, dokud profil není veřejný. Zápatí třetí sekce ukazuje čas poslední aktualizace — příklad použití zápatí pro doplňující kontextové informace. LabeledContent je standardní komponenta SwiftUI pro zobrazení páru „klíč-hodnota" ve Form.

Section s vlastním záhlavím

swift
Section(
    header: HStack {
        Image(systemName: "bell.fill")
            .foregroundStyle(.blue)
        Text("Oznámení")
            .font(.headline)
    },
    footer: Text("Spravovat push a e-mailová oznámení")
) {
    Toggle("Push notifications", isOn: $push)
    Toggle("Email notifications", isOn: $email)
    Stepper("Quiet hours: \(quietStart) — \(quietEnd)",
            value: $quietStart,
            in: 0...23)
}

Tento příklad ukazuje, že header může být jakékoli SwiftUI View. Použití HStack s Image a Text umožňuje přidat ikonu vedle záhlaví, čímž je sekce vizuálně výraznější. Vlastní záhlaví jsou užitečná pro zvýraznění důležitých sekcí v rozhraní: nastavení oznámení, placené funkce nebo sekce s varováními. Nicméně s vlastními záhlavími to nepřehánějte — 1–2 sekce s nestandardním vzhledem na obrazovku stačí k zachování jednotnosti rozhraní.

Často kladené dotazy

Lze Section vnořit do sebe?

Ne, Section nepodporuje vnořování ve SwiftUI. Pokus o umístění Section do jiné Section způsobí chybu kompilace. Pro hierarchické seskupování použijte List s OutlineGroup nebo DisclosureGroup uvnitř Section.

Jak změnit mezery mezi Section?

Mezery mezi Section jsou spravovány systémem a nelze je změnit pomocí modifikátorů padding. Na iOS je vzdálenost mezi sekcemi 16–20 bodů a odpovídá HIG. Jediný způsob, jak ovlivnit mezery, je použití vlastního ListStyle, ale to se nedoporučuje.

Čím se Section liší od Group ve SwiftUI?

Group je neviditelný kontejner pro seskupování prvků bez vizuálního formátování. Section přidává záhlaví, zápatí, mezery a vizuální blok. Group se používá pro podmíněné vykreslování, Section — pro strukturování rozhraní.

Podporuje Section Accessibility?

Ano, Section automaticky přidává popisky přístupnosti. Záhlaví sekce se stává popiskem přístupnosti skupiny, zápatí — tipem přístupnosti. VoiceOver přečte záhlaví před vstupem do sekce, což zlepšuje navigaci pro uživatele s postižením.

Lze Section použít bez Form nebo List?

Ne, Section funguje pouze uvnitř Form nebo List. Použití Section mimo tyto kontejnery způsobí chybu kompilace. Pro seskupování prvků ve VStack nebo ScrollView použijte Group nebo vlastní Views s ručním nastavením mezer.

Shrnutí

  • Section — kontejner pro seskupování prvků v Form a List se systémovými mezerami
  • Header a footer — volitelné parametry pro kontextové informace o skupině
  • ForEach uvnitř Section umožňuje vytvářet dynamické skupiny s opakujícími se prvky
  • Vnořování Section je zakázáno — pro podskupiny použijte DisclosureGroup
  • Styl Section závisí na kontejneru: Form standardně používá insetGrouped, List — plain
  • Vlastní header může být jakékoli SwiftUI View s ikonou a vlastním písmem
  • Použijte Section pro logické seskupování vstupních polí a nastavení

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také