Responsive Design — подход к построению интерфейсов, при котором макет автоматически адаптируется под размер, ориентацию и тип устройства. В мобильной разработке responsive design реализуется через size classes в iOS и configuration qualifiers в Android. Статья разбирает принципы адаптивной вёрстки, инструменты обеих платформ и примеры кода.
Главное
Responsive Design — метод построения интерфейсов, при котором макет реагирует на размер экрана, ориентацию и доступное пространство, перестраивая расположение элементов без потери функциональности. Термин предложил Ethan Marcotte в 2010 году для веб-дизайна, но принципы полностью применимы к нативным мобильным приложениям.
В мобильной разработке responsive design означает, что одно и то же приложение корректно отображается на всех устройствах: от iPhone SE (375 pt) до iPad Pro (1024 pt в портрете) и от Android-смартфона (360 dp) до планшета (800 dp). Ключевые элементы — гибкая сетка (flexible grid), адаптивные изображения и медиа-запросы на уровне фреймворка (size classes, qualifiers).
По данным Apple Developer Documentation, приложение должно быть универсальным (universal) — работающим на всех устройствах без отдельной сборки для iPad. Google Play рекомендует использовать adaptive layouts через Jetpack WindowManager и canonical layouts. Отсутствие адаптации под планшеты — частая причина отрицательных отзывов.
Термины responsive и adaptive часто путают, хотя они описывают разные подходы. Responsive design использует гибкую сетку, которая непрерывно подстраивается под ширину экрана. Adaptive design использует фиксированные макеты для заранее определённых breakpoints — приложение переключается между ними скачкообразно.
| Характеристика | Responsive Design | Adaptive Design |
|---|---|---|
| Подход | Плавное перетекание | Дискретные переключения |
| Сетка | Процентная, fluid | Фиксированная на каждый breakpoint |
| Реализация | Auto Layout, Flexbox, ConstraintLayout | Size Classes, layout-w600dp, separate storyboards |
| Количество дизайн-макетов | Один, но гибкий | Несколько (phone portrait, phone landscape, tablet) |
На практике мобильные приложения используют комбинацию обоих подходов. Базовая сетка строится responsive (Auto Layout с constraint-зависимостями), а при достижении breakpoint (например, ширина > 600 pt) макет переключается на адаптивную версию с другой компоновкой элементов. iOS сочетает Auto Layout (responsive) с Size Classes (adaptive). Android сочетает ConstraintLayout (responsive) с qualifier-ресурсами (adaptive).
Size Classes — механизм iOS, который классифицирует доступное пространство экрана по двум осям: горизонтальной и вертикальной. Каждая ось может быть Compact (C) или Regular (R). Комбинация даёт четыре варианта для адаптации макета: CR (обычный iPhone портрет), RR (iPad портрет/ландшафт), RC (iPhone ландшафт на Plus/Pro Max), CC (iPad Split View).
// Определение Size Classes в Swift
import UIKit
class AdaptiveViewController: UIViewController {
override func traitCollectionDidChange(
_ previousTraitCollection: UITraitCollection?
) {
super.traitCollectionDidChange(previousTraitCollection)
adjustLayout(for: traitCollection)
}
private func adjustLayout(for traits: UITraitCollection) {
switch (traits.horizontalSizeClass, traits.verticalSizeClass) {
case (.regular, .regular):
showSplitView() // iPad — показываем master-detail
case (.compact, .regular):
showStackedView() // iPhone портрет — стековый layout
case (.compact, .compact):
showCompactView() // iPhone SE ландшафт — минимизированный
default:
showDefaultView()
}
}
private func showSplitView() {
// Используем UISplitViewController или HStack
}
private func showStackedView() {
// Вертикальный стек для iPhone
}
private func showCompactView() {
// Скрываем второстепенные элементы, показываем главные
}
}В Interface Builder Size Classes настраиваются через панель «wAny hAny» — разработчик выбирает конкретную комбинацию (wRegular hRegular, wCompact hRegular) и добавляет constraint-вариации. SwiftUI использует @Environment(\.horizontalSizeClass) и @Environment(\.verticalSizeClass) для реактивной адаптации — при смене ориентации или размера окна SwiftUI автоматически перерисовывает view.
// Size Classes в SwiftUI
import SwiftUI
struct ResponsiveView: View {
@Environment(\.horizontalSizeClass) private var hSizeClass
var body: some View {
if hSizeClass == .regular {
// iPad — горизонтальный layout с боковой панелью
HStack {
SidebarView()
.frame(width: 300)
ContentView()
}
} else {
// iPhone — вертикальный стек на весь экран
VStack {
ContentView()
}
}
}
}Configuration Qualifiers — механизм Android для загрузки различных ресурсов (layout, values, drawables) в зависимости от характеристик устройства. Квалификаторы включают размер экрана (small, normal, large, xlarge), ориентацию (port, land), минимальную ширину (sw
// Определение конфигурации устройства в Kotlin
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val config = resources.configuration
val screenWidthDp = config.screenWidthDp
val screenHeightDp = config.screenHeightDp
val orientation = config.orientation
when {
screenWidthDp >= 900 -> setContentView(R.layout.activity_main_tablet)
screenWidthDp >= 600 -> setContentView(R.layout.activity_main_sw600)
else -> setContentView(R.layout.activity_main_phone)
}
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
supportFragmentManager.beginTransaction()
.replace(R.id.container, LandscapeFragment())
.commit()
}
}
}Структура ресурсов для разных экранов: res/layout/activity_main.xml (телефон), res/layout-sw600dp/activity_main.xml (планшет 7"), res/layout-sw720dp/activity_main.xml (планшет 10"). Android автоматически выбирает правильный layout на основе smallestWidth — минимальной ширины экрана в dp независимо от ориентации. Qualifier sw
// Jetpack Compose — WindowSizeClass для адаптации
@Composable
fun ResponsiveScreen() {
val windowSizeClass = currentWindowAdaptiveInfo().windowSizeClass
when {
windowSizeClass.windowSizeClass == WindowWidthSizeClass.EXPANDED -> {
TabletLayout() // >= 840 dp
}
windowSizeClass.windowSizeClass == WindowWidthSizeClass.MEDIUM -> {
MediumLayout() // 600–840 dp
}
else -> {
CompactLayout() // < 600 dp
}
}
}Jetpack WindowManager (библиотека androidx.window) предоставляет WindowSizeClass с тремя категориями ширины: COMPACT (0–600 dp), MEDIUM (600–840 dp), EXPANDED (>840 dp). Это современная альтернатива старым qualifier-папкам. Рекомендуется Google для адаптации под складные устройства и планшеты.
Адаптивная сетка — основа responsive design. Вместо фиксированных размеров элементы используют процентные соотношения, flexible constraints и intrinsic content size. Breakpoints — точки ширины экрана, при достижении которых макет переключается между состояниями.
| Breakpoint | iOS Size Class | Android Qualifier | Тип устройства |
|---|---|---|---|
| 0–374 pt / dp | Compact width | — | iPhone SE, старые Android |
| 375–599 pt / dp | Compact width | sw320dp | iPhone 14, Galaxy S24 |
| 600–839 pt / dp | Regular width | sw600dp | iPad mini, планшеты 7" |
| 840+ pt / dp | Regular width | sw720dp | iPad Pro, планшеты 10" |
Рекомендуемые breakpoints от Google Material Design и Apple HIG: 0–599 dp (телефон, одна колонка), 600–839 dp (планшет, две колонки, navigation rail), 840+ dp (планшет, три колонки, navigation drawer). Количество breakpoints не должно превышать 4 — избыточные точки перехода усложняют поддержку и тестирование.
Успешный responsive design требует соблюдения набора правил, выработанных сообществом iOS и Android-разработчиков за последнее десятилетие. Ниже — ключевые рекомендации на основе Apple HIG, Google Material Design и опыта продакшн-проектов.
Главный принцип адаптивного дизайна: контент определяет layout, а не наоборот. Если на iPad отображается тот же стек карточек, что и на iPhone, но просто растянутый по ширине — это не responsive design. Responsive design переосмысливает компоновку: на iPhone — вертикальный скролл, на iPad — master-detail с боковой панелью.
Часто задаваемые вопросы
Responsive Design использует гибкую сетку, которая плавно подстраивается под ширину экрана. Adaptive Layout переключается между фиксированными макетами в точках breakpoint. На практике оба подхода комбинируются: базовая сетка responsive + адаптивные переключения для кардинальных изменений (телефон vs планшет).
iOS использует две оси: горизонтальная (Compact/Regular) и вертикальная (Compact/Regular). iPhone в портрете — Compact width, Regular height (CR). iPad — Regular width, Regular height (RR). iPhone Plus/Pro Max в ландшафте — Regular width, Compact height (RC). Разработчик задаёт constraint-вариации для каждой комбинации.
sw600dp (smallestWidth 600 dp) — квалификатор ресурсов Android, означающий, что минимальная ширина экрана устройства составляет не менее 600 dp. Используется для загрузки альтернативных layout под планшеты (7" и больше). Ориентация не влияет — sw учитывает наименьшую сторону экрана.
На iOS используйте симулятор с разными Size Classes и Preview в SwiftUI с устройствами разных размеров. На Android — профили устройств в эмуляторе (Pixel 5, Pixel C, Galaxy Tab) и Layout Validation в Android Studio. На обеих платформах обязательно тестируйте на физическом iPad/Android-планшете и складном устройстве.
Canonical layouts — готовые паттерны адаптивной компоновки от Google Material Design 3: list-detail (список + детализация), feed (лента карточек), supporting pane (основной контент + панель действий). Каждый паттерн имеет три варианта (compact/medium/expanded) и автоматически адаптируется под WindowSizeClass.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также