Size Class — je mechanismus iOS pro adaptivní rozvržení, který rozděluje všechna zařízení do dvou kategorií podle každé osy: Compact (úzký/krátký) a Regular (široký/dlouhý). Kombinace těchto hodnot určují, jak se rozhraní zobrazuje na iPhone, iPad, Mac Catalyst a CarPlay. Podle Apple Human Interface Guidelines, 2024 umožňuje Size Class vytvoření jednoho storyboardu pro všechna zařízení pomocí Auto Layout a UITraitCollection. Systém funguje na všech zařízeních iOS od iOS 8.
Hlavní body
Size Class — je abstraktní klasifikace obrazovky v iOS, zavedená společností Apple v iOS 8 pro sjednocení adaptivního rozvržení. Místo kontroly konkrétního modelu zařízení určuje Size Class dvě charakteristiky: dostupný prostor horizontálně a vertikálně. Každá charakteristika nabývá jedné ze dvou hodnot — Compact (omezený prostor) nebo Regular (dostatečný prostor). Kombinace těchto hodnot tvoří trait collection, která je předávána všem prvkům rozhraní.
Před příchodem Size Class vytvářeli vývojáři samostatné storyboardy pro iPhone a iPad nebo používali kontroly UI_USER_INTERFACE_IDIOM() v kódu. To vedlo k duplicitě kódu, nafouknutí storyboardů a potížím s podporou nových velikostí obrazovek. Size Class vyřešil problém nabídkou univerzálního systému: vývojář nakonfiguruje rozhraní pro 4 kombinace Compact/Regular a iOS automaticky vybere tu správnou. S příchodem Split View na iPadu a různých velikostí iPhone se systém stal nepostradatelným pro adaptivní rozvržení.
Size Class je vypočítáván iOS na základě šířky a výšky aktuální obrazovky s ohledem na orientaci a multitasking. Hodnoty nejsou vázány na konkrétní pixely — jde o logickou kategorii. Například iPhone 16 Pro v portrétu má horizontální Compact a vertikální Regular. Stejný iPhone v krajině — Compact na obou osách. iPad v Split View s aplikací na 1/3 obrazovky získává horizontální Compact, i když v režimu celé obrazovky — Regular. Systém automaticky aktualizuje Size Class při změně orientace nebo Split View.
Size Class používá čtyři kombinace dvou hodnot na dvou osách. Každá kombinace má své uplatnění v závislosti na typu zařízení a jeho orientaci. Pochopení těchto kombinací je základem navrhování adaptivního rozhraní pro iOS. Systém pokrývá všechna aktuální zařízení Apple: iPhone, iPad, Mac Catalyst a CarPlay. Apple doporučuje začít navrhování s kombinací wAny hAny (základní rozvržení) a upřesnit pro konkrétní kombinace.
wCompact hRegular — portrétní iPhone (kromě Plus/Max v některých případech). wCompact hCompact — krajinný iPhone SE/6/7/8. wRegular hRegular — iPad na celou obrazovku v libovolné orientaci, iPhone Plus/Max v krajině. wRegular hCompact — iPad v krajině s úzkým obsahem. Každá kombinace určuje, která omezení a prvky jsou aktivní. Vývojář může nastavit vzhled pro každou kombinaci zvlášť v Interface Builder.
Na Mac Catalyst je Size Class vždy wRegular hRegular — rozhraní plné velikosti. To znamená, že Mac verze aplikace pro iPad získává maximální prostor. Vývojář může použít dodatečné kontroly přes UIScreen.traitCollection.userInterfaceIdiom k rozlišení Mac od iPad. Size Class na Macu funguje stabilně, ale aplikace Catalyst často vyžadují další přizpůsobení pro myš a klávesnici, přesahující rámec Size Class.
Size Class určuje, která Auto Layout omezení jsou aktivní, které prvky rozhraní jsou viditelné a jak jsou uspořádány subview. Vývojář může nastavit různá omezení pro různé Size Class a iOS je automaticky přepíná při změně trait collection. Například na iPad (wRegular hRegular) se tabulka s detaily zobrazuje v Master-Detail, na iPhone (wCompact hRegular) — v Navigation Stack. Toto je hlavní scénář adaptivního rozvržení s Size Class.
V Interface Builder vývojář vybere kombinaci Size Class pomocí tlačítka Vary for Traits a přidá omezení, která mají fungovat pouze pro tuto kombinaci. Omezení nastavená pro wAny hAny fungují vždy. Omezení nastavená pro konkrétní kombinaci se aktivují pouze při shodě Size Class. Pokud pro kombinaci nejsou nastavena žádná speciální omezení, použijí se základní. Při změně Size Class iOS animuje přechod mezi sadami omezení.
Příznak Installed v Interface Builder umožňuje skrýt prvky pro určité Size Class. Vývojář označí prvek jako Uninstalled pro vybranou kombinaci. Například tlačítko Details je viditelné pouze na iPad (wRegular hRegular) a na iPhone — skryté. To je jednodušší než správa isHidden v kódu. Pro programové skrytí se používá přepsání traitCollectionDidChange nebo metoda willTransition, kde se kontroluje aktuální Size Class.
Interface Builder poskytuje vizuální nástroj Vary for Traits pro práci s Size Class. Vývojář vybere požadovanou kombinaci (šířku a výšku) a Interface Builder zobrazí náhled obrazovky pro tuto kombinaci. Všechny změny omezení, velikostí, písem a viditelnosti provedené v tomto režimu se aplikují pouze na vybraný Size Class. Opuštění režimu potvrzuje nastavení. Tento přístup nahrazuje potřebu psát kód přizpůsobení pro různá zařízení.
Pro konfiguraci Size Class v Interface Builder vývojář otevře storyboard, vybere view controller a stiskne tlačítko Vary for Traits v dolním panelu. Poté vybere Width (Compact, Regular nebo Any) a Height (Compact, Regular nebo Any). Rozhraní se přepne do režimu úprav pro vybranou kombinaci. Všechny změny omezení, přidání nebo odstranění prvků se aplikují pouze na tuto kombinaci. Po dokončení konfigurace vývojář opustí režim — změny se uloží pro konkrétní kombinaci Size Class.
Apple doporučuje začít se základním rozvržením pro wAny hAny (základní kombinace pokrývající všechna zařízení). Poté upřesnit rozvržení pro problematické kombinace: wCompact hRegular (portrétní iPhone) a wRegular hRegular (iPad). Nedoporučuje se konfigurovat každou kombinaci — pouze tam, kde se rozvržení láme. Nadměrná konfigurace ztěžuje údržbu. Pro přesné nastavení písem použijte Dynamic Type místo Size Class: písma se automaticky přizpůsobí velikosti obrazovky.
UITraitCollection — je třída iOS, která obsahuje aktuální Size Class a další charakteristiky prostředí (force touch, display scale, user interface idiom). Každý UIView a UIViewController má svůj traitCollection, zděděný od rodiče. Vývojář získává Size Class přes traitCollection.horizontalSizeClass a traitCollection.verticalSizeClass, které vracejí UIUserInterfaceSizeClass (.compact, .regular nebo .unspecified). Změna Size Class je sledována přepsáním traitCollectionDidChange.
Zvažte příklad přizpůsobení rozvržení UICollectionView pro Size Class. Na iPad (wRegular hRegular) používáme UICollectionViewCompositionalLayout se dvěma sloupci, na iPhone (wCompact hRegular) — s jedním. Kód zkontroluje horizontální Size Class a vybere odpovídající rozvržení. Při otočení nebo přechodu do Split View iOS zavolá traitCollectionDidChange a kontroler přepne rozvržení s animací.
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.horizontalSizeClass == .Compact {
collectionView.collectionViewLayout = SingleColumnLayout()
} else {
collectionView.collectionViewLayout = DoubleColumnLayout()
}
}
Metoda traitCollectionDidChange je volána při každé změně Size Class: otočení zařízení, vstup/výstup ze Split View, připojení externího displeje. V této metodě vývojář aktualizuje rozvržení, znovu načte kolekce, aktualizuje priority omezení nebo mění viditelnost prvků. Je důležité zkontrolovat, zda se změnil právě Size Class, nikoli jiná charakteristika: porovnejte traitCollection.horizontalSizeClass s previousTraitCollection?.horizontalSizeClass. Optimalizace zabraňuje zbytečným překreslením při změně force touch nebo display scale.
Různá zařízení Apple mají různé kombinace Size Class a vývojář musí tyto vlastnosti zohlednit. iPhone v portrétu — wCompact hRegular, v krajině — závisí na modelu: iPhone SE/6/7/8 (wCompact hCompact), iPhone X a novější (wCompact hCompact nebo wCompact hRegular v závislosti na obsahu). iPad v režimu celé obrazovky — wRegular hRegular, v Split View — může být wCompact hRegular (1/3 obrazovky) nebo wRegular hRegular (2/3 obrazovky). Mac Catalyst — vždy wRegular hRegular.
Na iPhone je Size Class stabilní pro většinu modelů, ale existují nuance. iPhone Plus (6+, 7+, 8+) a Max (X, XS, 11 Pro, 13–16 Pro Max) v krajině mají wRegular hCompact — jako iPad mini. To umožňuje umístit obsah do dvou sloupců na velkých iPhone v krajině. iPhone SE (1–3 generace) v krajině — wCompact hCompact. Vertikální Size Class na všech iPhone v portrétu — Regular, kromě iPhone SE v krajině, kde je Compact. Horizontální — vždy Compact pro portrét i krajinu (kromě Plus/Max v krajině).
iPad v režimu celé obrazovky — wRegular hRegular, což poskytuje maximální flexibilitu rozvržení. V Split View se chování mění: pokud aplikace zabírá 1/3 obrazovky (Slide Over nebo Split na 1/3), horizontální Size Class se stává Compact, i když vertikální zůstává Regular. Při 2/3 obrazovky — wRegular hRegular. Vývojář by měl testovat rozhraní ve všech režimech Split View, protože Size Class se dynamicky mění. Apple doporučuje používat Size Class společně s UISplitViewController pro konzistentní chování na iPad.
Často kladené otázky
Size Class — diskrétní systém se 4 kombinacemi, zatímco CSS-breakpointy jsou spojité s libovolným počtem bodů. Size Class abstrahuje od konkrétních velikostí obrazovky a seskupuje zařízení podle chování. CSS-breakpointy jsou vázány na pixely, Size Class — na logické kategorie Compact/Regular.
iPhone Plus/Max v krajině má dostatečnou šířku obrazovky pro zobrazení obsahu ve dvou sloupcích (jako na iPad mini). Apple přiřazuje horizontální Regular, aby vývojář mohl používat multi-column layout bez dalších kontrol. Toto je výjimka z pravidla Compact pro iPhone.
Size Class je určen iOS na základě skutečných charakteristik zařízení a nelze jej změnit z kódu aplikace. Vývojář může pouze reagovat na aktuální hodnotu. System UI může přepsat Size Class pro systémové prvky, ale v aplikaci to není možné.
SwiftUI nepoužívá Size Class přímo — místo toho vývojář aplikuje modifikátory @Environment(\.horizontalSizeClass) pro čtení aktuální hodnoty. SwiftUI nabízí nástroje vyšší úrovně: Size Classes a AnyLayout s Layout protocol pro adaptivní rozvržení.
Ano, při připojení externího displeje přes Stage Manager nebo Sidecar iOS aktualizuje Size Class. Externí monitor obvykle získává wRegular hRegular, zatímco hlavní obrazovka si zachovává svůj Size Class. traitCollectionDidChange je volán pro okna na každé obrazovce nezávisle.
Shrnutí
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í.
Přečtěte si také