Size Class — це механізм iOS для адаптивного верстання, який розділяє всі пристрої на дві категорії за кожною віссю: Compact (вузький/короткий) і Regular (широкий/довгий). Комбінації цих значень визначають, як інтерфейс відображається на iPhone, iPad, Mac Catalyst і CarPlay. Згідно з Apple Human Interface Guidelines, 2024, Size Class дозволяє будувати один storyboard для всіх пристроїв, використовуючи Auto Layout і UITraitCollection. Система працює на всіх iOS-пристроях починаючи з iOS 8.
Головне
Size Class — це абстрактна класифікація екрана в iOS, введена Apple в iOS 8 для уніфікації адаптивного верстання. Замість перевірки конкретної моделі пристрою, Size Class визначає дві характеристики: доступний простір по горизонталі та вертикалі. Кожна характеристика приймає одне з двох значень — Compact (обмежений простір) або Regular (достатній простір). Комбінація цих значень утворює траїт-колекцію (trait collection), яка передається всім елементам інтерфейсу.
До появи Size Class розробники створювали окремі storyboard для iPhone і iPad або використовували перевірки UI_USER_INTERFACE_IDIOM() у коді. Це призводило до дублювання коду, роздування storyboard і складнощів при підтримці нових розмірів екранів. Size Class вирішив проблему, запропонувавши універсальну систему: розробник налаштовує інтерфейс для 4 комбінацій Compact/Regular, і iOS автоматично вибирає потрібну. З появою Split View на iPad і різних розмірів iPhone система стала незамінною для адаптивного верстання.
Size Class обчислюється iOS на основі ширини та висоти поточного екрана з урахуванням орієнтації та багатозадачності. Значення не прив'язані до конкретних пікселів — це логічна категорія. Наприклад, iPhone 16 Pro у портреті має горизонтальний Compact і вертикальний Regular. Той самий iPhone у ландшафті — Compact по обох осях. iPad у Split View з додатком на 1/3 екрана отримує горизонтальний Compact, хоча на повноекранному режимі — Regular. Система автоматично оновлює Size Class при зміні орієнтації або Split View.
Size Class використовує чотири комбінації двох значень на двох осях. Кожна комбінація має своє застосування залежно від типу пристрою та його орієнтації. Розуміння цих комбінацій — основа проєктування адаптивного інтерфейсу для iOS. Система охоплює всі актуальні пристрої Apple: iPhone, iPad, Mac Catalyst і CarPlay. Apple рекомендує починати проєктування з комбінації wAny hAny (базовий layout) і уточнювати для конкретних комбінацій.
wCompact hRegular — портретний iPhone (крім Plus/Max у деяких випадках). wCompact hCompact — ландшафтний iPhone SE/6/7/8. wRegular hRegular — повноекранний iPad у будь-якій орієнтації, iPhone Plus/Max у ландшафті. wRegular hCompact — iPad у ландшафті з вузьким контентом. Кожна комбінація визначає, які констрейнтси та елементи активні. Розробник може задати зовнішній вигляд для кожної комбінації окремо в Interface Builder.
На Mac Catalyst Size Class завжди wRegular hRegular — повнорозмірний інтерфейс. Це означає, що Mac-версія iPad-додатка отримує максимальний простір. Розробник може використовувати додаткові перевірки через UIScreen.traitCollection.userInterfaceIdiom для відрізнення Mac від iPad. Size Class на Mac працює стабільно, але Catalyst-додатки часто вимагають додаткової адаптації для миші та клавіатури, що виходить за рамки Size Class.
Size Class визначає, які Auto Layout-констрейнтси активні, які елементи інтерфейсу видимі та як розташовані subview. Розробник може задати різні констрейнтси для різних Size Class, і iOS автоматично перемикає їх при зміні траїт-колекції. Наприклад, на iPad (wRegular hRegular) таблиця з деталізацією відображається в Master-Detail, на iPhone (wCompact hRegular) — у Navigation Stack. Це основний сценарій адаптивного верстання з Size Class.
В Interface Builder розробник вибирає комбінацію Size Class через кнопку Vary for Traits і додає констрейнтси, які повинні діяти тільки для цієї комбінації. Констрейнтси, встановлені для wAny hAny, діють завжди. Констрейнтси, встановлені для конкретної комбінації, активуються тільки при збігу Size Class. Якщо для комбінації не задані спеціальні констрейнтси, використовуються базові. При зміні Size Class iOS анімує перехід між наборами констрейнтсів.
Прапорець Installed в Interface Builder дозволяє приховувати елементи для певних Size Class. Розробник позначає елемент як Uninstalled для вибраної комбінації. Наприклад, кнопка Details видна тільки на iPad (wRegular hRegular), а на iPhone — прихована. Це простіше, ніж керувати isHidden у коді. Для програмного приховування використовується перевизначення traitCollectionDidChange або метод willTransition, де перевіряється поточний Size Class.
Interface Builder надає візуальний інструмент Vary for Traits для роботи з Size Class. Розробник вибирає потрібну комбінацію (ширина та висота), і Interface Builder показує попередній перегляд екрана для цієї комбінації. Всі зміни констрейнтсів, розмірів, шрифтів і видимості, зроблені в цьому режимі, застосовуються тільки до вибраного Size Class. Вихід із режиму фіксує налаштування. Цей підхід замінює необхідність писати код адаптації для різних пристроїв.
Для налаштування Size Class в Interface Builder розробник відкриває storyboard, вибирає в'ю-контролер і натискає кнопку Vary for Traits у нижній панелі. Потім вибирає Width (Compact, Regular або Any) і Height (Compact, Regular або Any). Інтерфейс перемикається в режим редагування для вибраної комбінації. Всі зміни констрейнтсів, додавання або видалення елементів застосовуються тільки до цієї комбінації. Після завершення налаштування розробник виходить із режиму — зміни зберігаються для конкретної комбінації Size Class.
Apple рекомендує починати з базового layout для wAny hAny (базова комбінація, що охоплює всі пристрої). Потім уточнювати layout для проблемних комбінацій: wCompact hRegular (портретний iPhone) і wRegular hRegular (iPad). Не рекомендується налаштовувати кожну комбінацію — тільки ті, де layout ламається. Надмірне налаштування ускладнює підтримку. Для точного налаштування шрифтів використовуйте Dynamic Type замість Size Class: шрифти адаптуються автоматично до розміру екрана.
UITraitCollection — це клас iOS, який містить поточний Size Class та інші характеристики середовища (force touch, display scale, user interface idiom). Кожен UIView і UIViewController має свій traitCollection, що успадковується від батька. Розробник отримує Size Class через traitCollection.horizontalSizeClass і traitCollection.verticalSizeClass, які повертають UIUserInterfaceSizeClass (.compact, .regular або .unspecified). Зміна Size Class відстежується через перевизначення traitCollectionDidChange.
Розглянемо приклад адаптації UICollectionView layout під Size Class. На iPad (wRegular hRegular) використовуємо UICollectionViewCompositionalLayout з двома колонками, на iPhone (wCompact hRegular) — з однією. Код перевіряє горизонтальний Size Class і вибирає відповідний layout. При повороті або переході в Split View iOS викликає traitCollectionDidChange, і контролер перемикає layout з анімацією.
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.horizontalSizeClass == .Compact {
collectionView.collectionViewLayout = SingleColumnLayout()
} else {
collectionView.collectionViewLayout = DoubleColumnLayout()
}
}
Метод traitCollectionDidChange викликається при будь-якій зміні Size Class: поворот пристрою, вхід/вихід із Split View, підключення зовнішнього дисплея. У цьому методі розробник оновлює layout, перезавантажує колекції, оновлює constraint priorities або змінює видимість елементів. Важливо перевіряти, чи змінився саме Size Class, а не інша характеристика: порівняйте traitCollection.horizontalSizeClass з previousTraitCollection?.horizontalSizeClass. Оптимізація запобігає зайвим перемальовуванням при зміні force touch або display scale.
Різні пристрої Apple мають різні комбінації Size Class, і розробник повинен враховувати ці особливості. iPhone у портреті — wCompact hRegular, у ландшафті — модель залежить від моделі: iPhone SE/6/7/8 (wCompact hCompact), iPhone X і новіші (wCompact hCompact або wCompact hRegular залежно від контенту). iPad у повноекранному режимі — wRegular hRegular, у Split View — може бути wCompact hRegular (1/3 екрана) або wRegular hRegular (2/3 екрана). Mac Catalyst — завжди wRegular hRegular.
На iPhone Size Class стабільний для більшості моделей, але є нюанси. iPhone Plus (6+, 7+, 8+) і Max (X, XS, 11 Pro, 13–16 Pro Max) у ландшафті мають wRegular hCompact — як iPad mini. Це дозволяє розміщувати контент у дві колонки на великих iPhone у ландшафті. iPhone SE (1–3 покоління) у ландшафті — wCompact hCompact. Вертикальний Size Class на всіх iPhone у портреті — Regular, крім iPhone SE у ландшафті, де він Compact. Горизонтальний — завжди Compact для портрета та ландшафту (крім Plus/Max у ландшафті).
iPad у повноекранному режимі — wRegular hRegular, що дає максимальну гнучкість layout. У Split View поведінка змінюється: якщо додаток займає 1/3 екрана (Slide Over або Split при 1/3), горизонтальний Size Class стає Compact, хоча вертикальний залишається Regular. При 2/3 екрана — wRegular hRegular. Розробник повинен тестувати інтерфейс у всіх режимах Split View, оскільки Size Class змінюється динамічно. Apple рекомендує використовувати Size Class спільно з UISplitViewController для консистентної поведінки на iPad.
Часті запитання
Size Class — дискретна система з 4 комбінаціями, а CSS-брейкпоїнти — безперервна з довільною кількістю точок. Size Class абстрагується від конкретних розмірів екрана, групуючи пристрої за поведінкою. CSS-брейкпоїнти прив'язані до пікселів, Size Class — до логічних категорій Compact/Regular.
iPhone Plus/Max у ландшафті має ширину екрана, достатню для відображення контенту в дві колонки (як на iPad mini). Apple присвоює горизонтальний Regular, щоб розробник міг використовувати multi-column layout без додаткових перевірок. Це виняток із правила Compact для iPhone.
Size Class визначається iOS на основі реальних характеристик пристрою і не може бути змінений із коду додатка. Розробник може тільки реагувати на поточне значення. System UI може перевизначити Size Class для системних елементів, але в додатку це неможливо.
SwiftUI не використовує Size Class безпосередньо — натомість розробник застосовує модифікатор @Environment(\.horizontalSizeClass) для читання поточного значення. SwiftUI пропонує більш високорівневі інструменти: Size Classes і AnyLayout із Layout protocol для адаптивного верстання.
Так, при підключенні зовнішнього дисплея через Stage Manager або Sidecar iOS оновлює Size Class. Зовнішній монітор зазвичай отримує wRegular hRegular, а основний екран зберігає свій Size Class. traitCollectionDidChange викликається для вікон на кожному екрані незалежно.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також