Responsive Design — основы, адаптация интерфейсов под экраны

Автор: IT Sectr Опубликовано: 2026-02-25 Время чтения: 9 мин

Responsive Design — подход к построению интерфейсов, при котором макет автоматически адаптируется под размер, ориентацию и тип устройства. В мобильной разработке responsive design реализуется через size classes в iOS и configuration qualifiers в Android. Статья разбирает принципы адаптивной вёрстки, инструменты обеих платформ и примеры кода.

Главное

  • Responsive Design — адаптация интерфейса под разные размеры экранов, ориентации и типы устройств
  • Size Classes — механизм iOS для определения компактного или регулярного размера по горизонтали и вертикали
  • Configuration Qualifiers — Android-ресурсы (layout-w600dp, values-sw600dp) для разных конфигураций экрана
  • Адаптивная сетка — перекомпоновка элементов при изменении ширины экрана, а не просто растягивание
  • Breakpoints — точки перехода между состояниями макета (например, 375 pt для iPhone, 768 pt для iPad)

Что такое Responsive Design?

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 vs Adaptive Design

Термины responsive и adaptive часто путают, хотя они описывают разные подходы. Responsive design использует гибкую сетку, которая непрерывно подстраивается под ширину экрана. Adaptive design использует фиксированные макеты для заранее определённых breakpoints — приложение переключается между ними скачкообразно.

ХарактеристикаResponsive DesignAdaptive Design
ПодходПлавное перетеканиеДискретные переключения
СеткаПроцентная, fluidФиксированная на каждый breakpoint
РеализацияAuto Layout, Flexbox, ConstraintLayoutSize 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).

iOS Size Classes: Compact и Regular

Size Classes — механизм iOS, который классифицирует доступное пространство экрана по двум осям: горизонтальной и вертикальной. Каждая ось может быть Compact (C) или Regular (R). Комбинация даёт четыре варианта для адаптации макета: CR (обычный iPhone портрет), RR (iPad портрет/ландшафт), RC (iPhone ландшафт на Plus/Pro Max), CC (iPad Split View).

swift
// Определение 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.

swift
// 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()
            }
        }
    }
}

Android Configuration Qualifiers

Configuration Qualifiers — механизм Android для загрузки различных ресурсов (layout, values, drawables) в зависимости от характеристик устройства. Квалификаторы включают размер экрана (small, normal, large, xlarge), ориентацию (port, land), минимальную ширину (swdp), доступную ширину (wdp) и высоту (hdp).

kotlin
// Определение конфигурации устройства в 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 swdp — наиболее стабильный способ адаптации.

kotlin
// 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 для адаптации под складные устройства и планшеты.

Адаптивная сетка и breakpoints

Адаптивная сетка — основа responsive design. Вместо фиксированных размеров элементы используют процентные соотношения, flexible constraints и intrinsic content size. Breakpoints — точки ширины экрана, при достижении которых макет переключается между состояниями.

BreakpointiOS Size ClassAndroid QualifierТип устройства
0–374 pt / dpCompact widthiPhone SE, старые Android
375–599 pt / dpCompact widthsw320dpiPhone 14, Galaxy S24
600–839 pt / dpRegular widthsw600dpiPad mini, планшеты 7"
840+ pt / dpRegular widthsw720dpiPad 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 для iPhone SE (375 pt) или Android compact (360 dp), затем добавляйте расширения для больших экранов. Это гарантирует, что критический контент поместится везде
  • Используйте intrinsic content size — UILabel, UIButton, ImageView имеют natural size. Auto Layout и ConstraintLayout используют его для автоматического позиционирования без лишних constraint
  • Не скрывайте контент на маленьких экранах — вместо скрытия перекомпоновывайте (reflow). Пользователь должен иметь доступ к тому же функционалу, просто в другой последовательности
  • Тестируйте на всех size classes — симулятор iOS позволяет переключать Size Classes без перезапуска. Android Emulator предоставляет разные профили устройств. Обязательно тестируйте на планшетах и складных устройствах
  • Material 3 Adaptive Layout — Google предоставляет готовые canonical layouts для списка/детализации, панелей инструментов и навигации. Используйте их вместо изобретения собственных паттернов

Главный принцип адаптивного дизайна: контент определяет layout, а не наоборот. Если на iPad отображается тот же стек карточек, что и на iPhone, но просто растянутый по ширине — это не responsive design. Responsive design переосмысливает компоновку: на iPhone — вертикальный скролл, на iPad — master-detail с боковой панелью.

Часто задаваемые вопросы

Чем Responsive Design отличается от Adaptive Layout?

Responsive Design использует гибкую сетку, которая плавно подстраивается под ширину экрана. Adaptive Layout переключается между фиксированными макетами в точках breakpoint. На практике оба подхода комбинируются: базовая сетка responsive + адаптивные переключения для кардинальных изменений (телефон vs планшет).

Какие Size Classes бывают в iOS?

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 в Android?

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 в Material Design?

Canonical layouts — готовые паттерны адаптивной компоновки от Google Material Design 3: list-detail (список + детализация), feed (лента карточек), supporting pane (основной контент + панель действий). Каждый паттерн имеет три варианта (compact/medium/expanded) и автоматически адаптируется под WindowSizeClass.

Итоги

  • Responsive Design — адаптация макета под размер и ориентацию экрана через гибкие сетки и breakpoints
  • Size Classes в iOS (Compact/Regular) определяют layout для iPhone, iPad и Split View
  • Configuration Qualifiers в Android (swdp, wdp, layout-land) загружают ресурсы под устройство
  • Jetpack WindowManager предоставляет WindowSizeClass с тремя категориями: COMPACT, MEDIUM, EXPANDED
  • Breakpoints: 0–599 dp (телефон), 600–839 dp (планшет), 840+ dp (широкий планшет)
  • Responsive ≠ простое растягивание — требуется перекомпоновка элементов (reflow), не скрытие контента
  • Тестирование на всех типах устройств, включая планшеты и складные, — обязательный этап разработки

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также