Size Class è un meccanismo iOS per il layout adattivo che divide tutti i dispositivi in due categorie per asse: Compact (stretto/corto) e Regular (largo/lungo). Le combinazioni di questi valori determinano come l'interfaccia viene visualizzata su iPhone, iPad, Mac Catalyst e CarPlay. Secondo Apple Human Interface Guidelines, 2024, Size Class permette di costruire un unico storyboard per tutti i dispositivi usando Auto Layout e UITraitCollection. Il sistema funziona su tutti i dispositivi iOS a partire da iOS 8.
Punti chiave
Size Class è una classificazione astratta dello schermo in iOS, introdotta da Apple in iOS 8 per unificare il layout adattivo. Invece di controllare un modello specifico di dispositivo, Size Class definisce due caratteristiche: spazio orizzontale e verticale disponibile. Ogni caratteristica assume uno dei due valori — Compact (spazio limitato) o Regular (spazio sufficiente). La combinazione di questi valori forma una raccolta di tratti (trait collection), che viene passata a tutti gli elementi dell'interfaccia.
Prima di Size Class, gli sviluppatori creavano storyboard separati per iPhone e iPad o utilizzavano controlli UI_USER_INTERFACE_IDIOM() nel codice. Questo portava a duplicazione di codice, storyboard gonfiati e difficoltà nel supportare nuove dimensioni dello schermo. Size Class ha risolto il problema offrendo un sistema universale: lo sviluppatore configura l'interfaccia per 4 combinazioni Compact/Regular e iOS seleziona automaticamente quella appropriata. Con l'avvento di Split View su iPad e delle diverse dimensioni di iPhone, il sistema è diventato indispensabile per il layout adattivo.
Size Class viene calcolato da iOS in base alla larghezza e altezza correnti dello schermo, tenendo conto dell'orientamento e del multitasking. I valori non sono legati a pixel specifici — è una categoria logica. Ad esempio, iPhone 16 Pro in verticale ha orizzontale Compact e verticale Regular. Lo stesso iPhone in orizzontale — Compact su entrambi gli assi. iPad in Split View con un'app a 1/3 dello schermo ottiene orizzontale Compact, sebbene in modalità schermo intero sia Regular. Il sistema aggiorna automaticamente Size Class al cambiamento dell'orientamento o di Split View.
Size Class utilizza quattro combinazioni di due valori su due assi. Ogni combinazione ha la sua applicazione a seconda del tipo di dispositivo e del suo orientamento. Comprendere queste combinazioni è la base per progettare un'interfaccia adattiva per iOS. Il sistema copre tutti i dispositivi Apple attuali: iPhone, iPad, Mac Catalyst e CarPlay. Apple raccomanda di iniziare la progettazione con la combinazione wAny hAny (layout base) e perfezionare per combinazioni specifiche.
wCompact hRegular — iPhone in verticale (tranne Plus/Max in alcuni casi). wCompact hCompact — iPhone SE/6/7/8 in orizzontale. wRegular hRegular — iPad a schermo intero in qualsiasi orientamento, iPhone Plus/Max in orizzontale. wRegular hCompact — iPad in orizzontale con contenuto stretto. Ogni combinazione determina quali vincoli ed elementi sono attivi. Lo sviluppatore può impostare l'aspetto per ogni combinazione separatamente in Interface Builder.
Su Mac Catalyst, Size Class è sempre wRegular hRegular — interfaccia a dimensioni complete. Ciò significa che la versione Mac di un'app iPad ottiene lo spazio massimo. Lo sviluppatore può utilizzare controlli aggiuntivi tramite UIScreen.traitCollection.userInterfaceIdiom per distinguere Mac da iPad. Size Class su Mac funziona in modo stabile, ma le app Catalyst spesso richiedono un adattamento aggiuntivo per mouse e tastiera oltre Size Class.
Size Class determina quali vincoli Auto Layout sono attivi, quali elementi dell'interfaccia sono visibili e come sono disposte le subview. Lo sviluppatore può impostare diversi vincoli per diversi Size Class e iOS li commuta automaticamente quando la raccolta di tratti cambia. Ad esempio, su iPad (wRegular hRegular) una tabella con dettagli viene visualizzata in Master-Detail, su iPhone (wCompact hRegular) — in Navigation Stack. Questo è lo scenario principale del layout adattivo con Size Class.
In Interface Builder, lo sviluppatore seleziona una combinazione Size Class tramite il pulsante Vary for Traits e aggiunge vincoli che dovrebbero applicarsi solo per quella combinazione. I vincoli impostati per wAny hAny si applicano sempre. I vincoli impostati per una combinazione specifica si attivano solo quando Size Class corrisponde. Se non ci sono vincoli speciali per una combinazione, vengono utilizzati i vincoli base. Quando Size Class cambia, iOS anima la transizione tra gli insiemi di vincoli.
Il flag Installed in Interface Builder permette di nascondere elementi per Size Class specifici. Lo sviluppatore marca un elemento come Uninstalled per la combinazione selezionata. Ad esempio, un pulsante Details è visibile solo su iPad (wRegular hRegular) e nascosto su iPhone. Questo è più semplice che gestire isHidden nel codice. Per la rimozione programmatica, sovrascrivi traitCollectionDidChange o utilizza il metodo willTransition, controllando lo Size Class corrente.
Interface Builder fornisce lo strumento visivo Vary for Traits per lavorare con Size Class. Lo sviluppatore seleziona la combinazione desiderata (larghezza e altezza) e Interface Builder mostra un'anteprima dello schermo per quella combinazione. Tutte le modifiche a vincoli, dimensioni, caratteri e visibilità effettuate in questa modalità si applicano solo allo Size Class selezionato. Uscire dalla modalità salva le impostazioni. Questo approccio sostituisce la necessità di scrivere codice di adattamento per diversi dispositivi.
Per configurare Size Class in Interface Builder, lo sviluppatore apre uno storyboard, seleziona il view controller e fa clic sul pulsante Vary for Traits nel pannello inferiore. Poi seleziona Width (Compact, Regular o Any) e Height (Compact, Regular o Any). L'interfaccia passa in modalità di modifica per la combinazione selezionata. Tutte le modifiche ai vincoli, l'aggiunta o la rimozione di elementi si applicano solo a questa combinazione. Dopo aver completato la configurazione, lo sviluppatore esce dalla modalità — le modifiche vengono salvate per la combinazione Size Class specifica.
Apple raccomanda di iniziare con un layout base per wAny hAny (la combinazione base che copre tutti i dispositivi). Poi perfezionare il layout per le combinazioni problematiche: wCompact hRegular (iPhone in verticale) e wRegular hRegular (iPad). Non è consigliato configurare ogni combinazione — solo quelle dove il layout si rompe. Una configurazione eccessiva complica la manutenzione. Per una regolazione precisa dei caratteri, usa Dynamic Type invece di Size Class: i caratteri si adattano automaticamente alla dimensione dello schermo.
UITraitCollection è una classe iOS che contiene lo Size Class corrente e altre caratteristiche dell'ambiente (force touch, scala dello schermo, idioma dell'interfaccia utente). Ogni UIView e UIViewController ha la propria traitCollection, ereditata dal genitore. Lo sviluppatore ottiene Size Class tramite traitCollection.horizontalSizeClass e traitCollection.verticalSizeClass, che restituiscono UIUserInterfaceSizeClass (.compact, .regular o .unspecified). I cambiamenti di Size Class vengono tracciati sovrascrivendo traitCollectionDidChange.
Consideriamo un esempio di adattamento del layout UICollectionView a Size Class. Su iPad (wRegular hRegular) usa UICollectionViewCompositionalLayout con due colonne, su iPhone (wCompact hRegular) — con una. Il codice controlla lo Size Class orizzontale e seleziona il layout appropriato. Durante la rotazione o il passaggio a Split View, iOS chiama traitCollectionDidChange e il controller cambia il layout con animazione.
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.horizontalSizeClass == .Compact {
collectionView.collectionViewLayout = SingleColumnLayout()
} else {
collectionView.collectionViewLayout = DoubleColumnLayout()
}
}
Il metodo traitCollectionDidChange viene chiamato ad ogni cambiamento di Size Class: rotazione del dispositivo, entrata/uscita da Split View, connessione di un display esterno. In questo metodo, lo sviluppatore aggiorna il layout, ricarica le collezioni, aggiorna le priorità dei vincoli o modifica la visibilità degli elementi. È importante verificare se Size Class è effettivamente cambiato, non un'altra caratteristica: confronta traitCollection.horizontalSizeClass con previousTraitCollection?.horizontalSizeClass. L'ottimizzazione previene ridisegni non necessari quando cambia force touch o scala dello schermo.
Diversi dispositivi Apple hanno diverse combinazioni Size Class e lo sviluppatore deve tenere conto di queste particolarità. iPhone in verticale — wCompact hRegular, in orizzontale — dipende dal modello: iPhone SE/6/7/8 (wCompact hCompact), iPhone X e successivi (wCompact hCompact o wCompact hRegular a seconda del contenuto). iPad in modalità schermo intero — wRegular hRegular, in Split View — può essere wCompact hRegular (1/3 di schermo) o wRegular hRegular (2/3 di schermo). Mac Catalyst — sempre wRegular hRegular.
Su iPhone, Size Class è stabile per la maggior parte dei modelli, ma ci sono sfumature. iPhone Plus (6+, 7+, 8+) e Max (X, XS, 11 Pro, 13–16 Pro Max) in orizzontale hanno wRegular hCompact — come iPad mini. Questo permette di posizionare il contenuto su due colonne sugli iPhone grandi in orizzontale. iPhone SE (1ª–3ª generazione) in orizzontale — wCompact hCompact. Size Class verticale su tutti gli iPhone in verticale è Regular, tranne iPhone SE in orizzontale dove è Compact. L'orizzontale è sempre Compact per verticale e orizzontale (tranne Plus/Max in orizzontale).
iPad in modalità schermo intero — wRegular hRegular, offrendo la massima flessibilità di layout. In Split View, il comportamento cambia: se l'app occupa 1/3 dello schermo (Slide Over o Split a 1/3), lo Size Class orizzontale diventa Compact, sebbene il verticale rimanga Regular. A 2/3 di schermo — wRegular hRegular. Lo sviluppatore dovrebbe testare l'interfaccia in tutte le modalità Split View, poiché Size Class cambia dinamicamente. Apple raccomanda di usare Size Class insieme a UISplitViewController per un comportamento coerente su iPad.
Domande frequenti
Size Class è un sistema discreto con 4 combinazioni, mentre i breakpoint CSS sono continui con un numero arbitrario di punti. Size Class si astrae dalle dimensioni specifiche dello schermo, raggruppando i dispositivi per comportamento. I breakpoint CSS sono legati ai pixel, Size Class — alle categorie logiche Compact/Regular.
iPhone Plus/Max in orizzontale ha una larghezza dello schermo sufficiente per visualizzare il contenuto su due colonne (come iPad mini). Apple assegna orizzontale Regular in modo che lo sviluppatore possa utilizzare un layout multi-colonna senza controlli aggiuntivi. Questa è un'eccezione alla regola Compact per iPhone.
Size Class è determinato da iOS in base alle caratteristiche reali del dispositivo e non può essere modificato dal codice dell'app. Lo sviluppatore può solo reagire al valore corrente. L'UI di sistema può sovrascrivere Size Class per gli elementi di sistema, ma nell'app questo è impossibile.
SwiftUI non usa Size Class direttamente — invece, lo sviluppatore usa il modificatore @Environment(\.horizontalSizeClass) per leggere il valore corrente. SwiftUI offre strumenti di livello superiore: Size Classes e AnyLayout con il protocollo Layout per il layout adattivo.
Sì, quando si collega un display esterno tramite Stage Manager o Sidecar, iOS aggiorna Size Class. Il monitor esterno ottiene solitamente wRegular hRegular, mentre lo schermo principale mantiene il suo Size Class. traitCollectionDidChange viene chiamato per le finestre su ogni schermo indipendentemente.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche