Size Class — este un mecanism iOS pentru layout adaptiv care împarte toate dispozitivele în două categorii pe fiecare axă: Compact (îngust/scurt) și Regular (lat/lung). Combinațiile acestor valori determină cum se afișează interfața pe iPhone, iPad, Mac Catalyst și CarPlay. Conform Apple Human Interface Guidelines, 2024, Size Class permite construirea unui singur storyboard pentru toate dispozitivele, folosind Auto Layout și UITraitCollection. Sistemul funcționează pe toate dispozitivele iOS începând cu iOS 8.
Principalele puncte
Size Class — este o clasificare abstractă a ecranului în iOS, introdusă de Apple în iOS 8 pentru unificarea layout-ului adaptiv. În loc să verifice modelul specific al dispozitivului, Size Class determină două caracteristici: spațiul disponibil pe orizontală și pe verticală. Fiecare caracteristică ia una din două valori — Compact (spațiu limitat) sau Regular (spațiu suficient). Combinația acestor valori formează trait collection, care este transmisă tuturor elementelor interfeței.
Înainte de apariția Size Class, dezvoltatorii creau storyboard-uri separate pentru iPhone și iPad sau foloseau verificări UI_USER_INTERFACE_IDIOM() în cod. Aceasta ducea la duplicarea codului, umflarea storyboard-urilor și dificultăți la suportarea noilor dimensiuni de ecran. Size Class a rezolvat problema oferind un sistem universal: dezvoltatorul configurează interfața pentru 4 combinații Compact/Regular, iar iOS alege automat cea potrivită. Odată cu apariția Split View pe iPad și a diferitelor dimensiuni iPhone, sistemul a devenit indispensabil pentru layout-ul adaptiv.
Size Class este calculat de iOS pe baza lățimii și înălțimii ecranului curent, ținând cont de orientare și multitasking. Valorile nu sunt legate de pixeli specifici — este o categorie logică. De exemplu, iPhone 16 Pro în portret are Compact orizontal și Regular vertical. Același iPhone în peisaj — Compact pe ambele axe. iPad în Split View cu o aplicație pe 1/3 din ecran primește Compact orizontal, deși în modul ecran complet — Regular. Sistemul actualizează automat Size Class la schimbarea orientării sau Split View.
Size Class folosește patru combinații a două valori pe două axe. Fiecare combinație are aplicarea sa în funcție de tipul dispozitivului și orientarea acestuia. Înțelegerea acestor combinații este baza proiectării interfeței adaptive pentru iOS. Sistemul acoperă toate dispozitivele Apple actuale: iPhone, iPad, Mac Catalyst și CarPlay. Apple recomandă începerea proiectării cu combinația wAny hAny (layout de bază) și rafinarea pentru combinații specifice.
wCompact hRegular — iPhone portret (cu excepția Plus/Max în unele cazuri). wCompact hCompact — iPhone SE/6/7/8 peisaj. wRegular hRegular — iPad ecran complet în orice orientare, iPhone Plus/Max în peisaj. wRegular hCompact — iPad în peisaj cu conținut îngust. Fiecare combinație determină ce constrângeri și elemente sunt active. Dezvoltatorul poate seta aspectul pentru fiecare combinație separat în Interface Builder.
Pe Mac Catalyst, Size Class este întotdeauna wRegular hRegular — interfață cu dimensiune completă. Aceasta înseamnă că versiunea Mac a aplicației iPad primește spațiu maxim. Dezvoltatorul poate folosi verificări suplimentare prin UIScreen.traitCollection.userInterfaceIdiom pentru a distinge Mac de iPad. Size Class pe Mac funcționează stabil, dar aplicațiile Catalyst necesită adesea adaptare suplimentară pentru mouse și tastatură, dincolo de domeniul Size Class.
Size Class determină ce constrângeri Auto Layout sunt active, ce elemente de interfață sunt vizibile și cum sunt dispuse subview-urile. Dezvoltatorul poate seta constrângeri diferite pentru Size Class-uri diferite, iar iOS le comută automat la schimbarea trait collection. De exemplu, pe iPad (wRegular hRegular) tabelul cu detalii se afișează în Master-Detail, pe iPhone (wCompact hRegular) — în Navigation Stack. Acesta este scenariul principal al layout-ului adaptiv cu Size Class.
În Interface Builder, dezvoltatorul selectează combinația Size Class prin butonul Vary for Traits și adaugă constrângeri care trebuie să acționeze doar pentru această combinație. Constrângerile setate pentru wAny hAny acționează întotdeauna. Constrângerile setate pentru o combinație specifică se activează doar la potrivirea Size Class. Dacă pentru o combinație nu sunt setate constrângeri speciale, se folosesc cele de bază. La schimbarea Size Class, iOS animează tranziția între seturile de constrângeri.
Indicatorul Installed din Interface Builder permite ascunderea elementelor pentru Size Class-uri specifice. Dezvoltatorul marchează elementul ca Uninstalled pentru combinația selectată. De exemplu, butonul Details este vizibil doar pe iPad (wRegular hRegular), iar pe iPhone — ascuns. Aceasta este mai simplu decât gestionarea isHidden în cod. Pentru ascunderea programatică se folosește suprascrierea traitCollectionDidChange sau metoda willTransition, unde se verifică Size Class curent.
Interface Builder oferă instrumentul vizual Vary for Traits pentru lucrul cu Size Class. Dezvoltatorul selectează combinația necesară (lățime și înălțime), iar Interface Builder arată previzualizarea ecranului pentru această combinație. Toate modificările de constrângeri, dimensiuni, fonturi și vizibilitate făcute în acest mod se aplică doar Size Class-ului selectat. Ieșirea din mod confirmă setările. Această abordare înlocuiește necesitatea de a scrie cod de adaptare pentru diferite dispozitive.
Pentru configurarea Size Class în Interface Builder, dezvoltatorul deschide storyboard-ul, selectează view controller-ul și apasă butonul Vary for Traits în panoul inferior. Apoi selectează Width (Compact, Regular sau Any) și Height (Compact, Regular sau Any). Interfața comută în modul de editare pentru combinația selectată. Toate modificările de constrângeri, adăugarea sau eliminarea elementelor se aplică doar acestei combinații. După finalizarea configurării, dezvoltatorul iese din mod — modificările sunt salvate pentru combinația specifică Size Class.
Apple recomandă începerea cu layout-ul de bază pentru wAny hAny (combinația de bază care acoperă toate dispozitivele). Apoi rafinați layout-ul pentru combinațiile problematice: wCompact hRegular (iPhone portret) și wRegular hRegular (iPad). Nu se recomandă configurarea fiecărei combinații — doar acolo unde layout-ul se strică. Configurarea excesivă complică întreținerea. Pentru reglarea fină a fonturilor, folosiți Dynamic Type în loc de Size Class: fonturile se adaptează automat la dimensiunea ecranului.
UITraitCollection — este o clasă iOS care conține Size Class curent și alte caracteristici ale mediului (force touch, display scale, user interface idiom). Fiecare UIView și UIViewController are propriul traitCollection, moștenit de la părinte. Dezvoltatorul obține Size Class prin traitCollection.horizontalSizeClass și traitCollection.verticalSizeClass, care returnează UIUserInterfaceSizeClass (.compact, .regular sau .unspecified). Schimbarea Size Class este urmărită prin suprascrierea traitCollectionDidChange.
Luați în considerare exemplul adaptării layout-ului UICollectionView la Size Class. Pe iPad (wRegular hRegular) folosim UICollectionViewCompositionalLayout cu două coloane, pe iPhone (wCompact hRegular) — cu una. Codul verifică Size Class orizontal și selectează layout-ul corespunzător. La rotire sau trecerea în Split View, iOS apelează traitCollectionDidChange, iar controlerul comută layout-ul cu animație.
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.horizontalSizeClass == .Compact {
collectionView.collectionViewLayout = SingleColumnLayout()
} else {
collectionView.collectionViewLayout = DoubleColumnLayout()
}
}
Metoda traitCollectionDidChange este apelată la orice schimbare a Size Class: rotirea dispozitivului, intrarea/ieșirea din Split View, conectarea unui display extern. În această metodă, dezvoltatorul actualizează layout-ul, reîncarcă colecțiile, actualizează prioritățile constrângerilor sau schimbă vizibilitatea elementelor. Este important să verificați dacă s-a schimbat exact Size Class, nu o altă caracteristică: comparați traitCollection.horizontalSizeClass cu previousTraitCollection?.horizontalSizeClass. Optimizarea previne redesenările inutile la schimbarea force touch sau display scale.
Diferitele dispozitive Apple au combinații diferite de Size Class, iar dezvoltatorul trebuie să țină cont de aceste particularități. iPhone în portret — wCompact hRegular, în peisaj — depinde de model: iPhone SE/6/7/8 (wCompact hCompact), iPhone X și mai noi (wCompact hCompact sau wCompact hRegular în funcție de conținut). iPad în modul ecran complet — wRegular hRegular, în Split View — poate fi wCompact hRegular (1/3 ecran) sau wRegular hRegular (2/3 ecran). Mac Catalyst — întotdeauna wRegular hRegular.
Pe iPhone, Size Class este stabil pentru majoritatea modelelor, dar există nuanțe. iPhone Plus (6+, 7+, 8+) și Max (X, XS, 11 Pro, 13–16 Pro Max) în peisaj au wRegular hCompact — ca iPad mini. Aceasta permite plasarea conținutului în două coloane pe iPhone-urile mari în peisaj. iPhone SE (generațiile 1–3) în peisaj — wCompact hCompact. Size Class vertical pe toate iPhone-urile în portret — Regular, cu excepția iPhone SE în peisaj, unde este Compact. Orizontal — întotdeauna Compact pentru portret și peisaj (cu excepția Plus/Max în peisaj).
iPad în modul ecran complet — wRegular hRegular, oferind maximă flexibilitate a layout-ului. În Split View comportamentul se schimbă: dacă aplicația ocupă 1/3 din ecran (Slide Over sau Split la 1/3), Size Class orizontal devine Compact, deși vertical rămâne Regular. La 2/3 ecran — wRegular hRegular. Dezvoltatorul trebuie să testeze interfața în toate modurile Split View, deoarece Size Class se schimbă dinamic. Apple recomandă utilizarea Size Class împreună cu UISplitViewController pentru un comportament consistent pe iPad.
Întrebări frecvente
Size Class — un sistem discret cu 4 combinații, în timp ce CSS-breakpoint-urile sunt continue cu un număr arbitrar de puncte. Size Class abstrage de la dimensiunile specifice ale ecranului, grupând dispozitivele după comportament. CSS-breakpoint-urile sunt legate de pixeli, Size Class — de categorii logice Compact/Regular.
iPhone Plus/Max în peisaj are lățimea ecranului suficientă pentru afișarea conținutului în două coloane (ca pe iPad mini). Apple atribuie orizontal Regular pentru ca dezvoltatorul să poată folosi multi-column layout fără verificări suplimentare. Aceasta este o excepție de la regula Compact pentru iPhone.
Size Class este determinat de iOS pe baza caracteristicilor reale ale dispozitivului și nu poate fi schimbat din codul aplicației. Dezvoltatorul poate doar să reacționeze la valoarea curentă. System UI poate suprascrie Size Class pentru elementele de sistem, dar în aplicație acest lucru este imposibil.
SwiftUI nu folosește Size Class direct — în schimb, dezvoltatorul aplică modificatorii @Environment(\.horizontalSizeClass) pentru citirea valorii curente. SwiftUI oferă instrumente de nivel superior: Size Classes și AnyLayout cu Layout protocol pentru layout adaptiv.
Da, la conectarea unui display extern prin Stage Manager sau Sidecar, iOS actualizează Size Class. Monitorul extern primește de obicei wRegular hRegular, iar ecranul principal își păstrează Size Class-ul. traitCollectionDidChange este apelat pentru ferestre pe fiecare ecran independent.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și