Responsive Design — bazele, adaptarea interfețelor la ecrane

Autor: IT Sectr Publicat: 2026-02-25 Timp de citire: 9 min

Responsive Design – o abordare a construirii interfețelor în care aspectul se adaptează automat la dimensiunea, orientarea și tipul dispozitivului. În dezvoltarea mobilă, responsive design este implementat prin size classes în iOS și configuration qualifiers în Android. Articolul analizează principiile layout-ului adaptiv, instrumentele ambelor platforme și exemple de cod.

Principalele

  • Responsive Design – adaptarea interfeței la diferite dimensiuni de ecran, orientări și tipuri de dispozitive
  • Size Classes – mecanism iOS pentru determinarea dimensiunii compacte sau regulate pe orizontală și verticală
  • Configuration Qualifiers – resurse Android (layout-w600dp, values-sw600dp) pentru diferite configurații de ecran
  • Grilă adaptivă – rearanjarea elementelor la modificarea lățimii ecranului, nu doar întinderea
  • Breakpoints – puncte de tranziție între stările layout-ului (de exemplu, 375 pt pentru iPhone, 768 pt pentru iPad)

Ce este Responsive Design?

Responsive Design – o metodă de construire a interfețelor în care layout-ul reacționează la dimensiunea ecranului, orientare și spațiul disponibil, rearanjând poziția elementelor fără pierderea funcționalității. Termenul a fost propus de Ethan Marcotte în 2010 pentru design web, dar principiile sunt pe deplin aplicabile aplicațiilor native mobile.

În dezvoltarea mobilă, responsive design înseamnă că aceeași aplicație se afișează corect pe toate dispozitivele: de la iPhone SE (375 pt) la iPad Pro (1024 pt în portret) și de la smartphone Android (360 dp) la tabletă (800 dp). Elementele cheie sunt grila flexibilă (flexible grid), imaginile adaptive și media queries la nivel de framework (size classes, qualifiers).

Conform Apple Developer Documentation, aplicația ar trebui să fie universală – funcționând pe toate dispozitivele fără o compilare separată pentru iPad. Google Play recomandă utilizarea adaptive layouts prin Jetpack WindowManager și canonical layouts. Lipsa adaptării la tablete este o cauză frecventă a recenziilor negative.

Responsive vs Adaptive Design

Termenii responsive și adaptive sunt adesea confundați, deși descriu abordări diferite. Responsive design folosește o grilă flexibilă care se adaptează continuu la lățimea ecranului. Adaptive design folosește layout-uri fixe pentru breakpoints predefinite – aplicația comută între ele brusc.

CaracteristicăResponsive DesignAdaptive Design
AbordareFlux continuuComutări discrete
GrilăProcentuală, fluidFixă pentru fiecare breakpoint
ImplementareAuto Layout, Flexbox, ConstraintLayoutSize Classes, layout-w600dp, storyboard-uri separate
Număr de macheteUna, dar flexibilăMai multe (phone portrait, phone landscape, tablet)

În practică aplicațiile mobile folosesc o combinație a ambelor abordări. Grila de bază este construită responsive (Auto Layout cu dependențe de constrângeri), iar la atingerea breakpoint-ului (de exemplu, lățime > 600 pt) layout-ul comută la o versiune adaptivă cu o altă compoziție a elementelor. iOS combină Auto Layout (responsive) cu Size Classes (adaptive). Android combină ConstraintLayout (responsive) cu resursele qualifier (adaptive).

iOS Size Classes: Compact și Regular

Size Classes – mecanism iOS care clasifică spațiul disponibil al ecranului pe două axe: orizontală și verticală. Fiecare axă poate fi Compact (C) sau Regular (R). Combinația oferă patru variante pentru adaptarea layout-ului: CR (iPhone obișnuit portret), RR (iPad portret/peisaj), RC (iPhone peisaj pe Plus/Pro Max), CC (iPad Split View).

swift
// Definirea Size Classes în 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 — afișăm master-detail
        case (.compact, .regular):
            showStackedView() // iPhone portret — layout tip stivă
        case (.compact, .compact):
            showCompactView() // iPhone SE peisaj — minimizat
        default:
            showDefaultView()
        }
    }

    private func showSplitView() {
        // Folosim UISplitViewController sau HStack
    }

    private func showStackedView() {
        // Stivă verticală pentru iPhone
    }

    private func showCompactView() {
        // Ascundem elementele secundare, arătăm principalele
    }
}

În Interface Builder, Size Classes se configurează prin panoul „wAny hAny" – dezvoltatorul selectează o combinație specifică (wRegular hRegular, wCompact hRegular) și adaugă variații de constrângeri. SwiftUI folosește @Environment(.horizontalSizeClass) și @Environment(.verticalSizeClass) pentru adaptare reactivă – la schimbarea orientării sau dimensiunii ferestrei, SwiftUI redesenează automat view-ul.

swift
// Size Classes în SwiftUI
import SwiftUI

struct ResponsiveView: View {
    @Environment(\.horizontalSizeClass) private var hSizeClass

    var body: some View {
        if hSizeClass == .regular {
            // iPad — layout orizontal cu panou lateral
            HStack {
                SidebarView()
                    .frame(width: 300)
                ContentView()
            }
        } else {
            // iPhone — stivă verticală pe tot ecranul
            VStack {
                ContentView()
            }
        }
    }
}

Android Configuration Qualifiers

Configuration Qualifiers – mecanism Android pentru încărcarea diferitelor resurse (layout, values, drawables) în funcție de caracteristicile dispozitivului. Calificatorii includ dimensiunea ecranului (small, normal, large, xlarge), orientarea (port, land), lățimea minimă (swdp), lățimea disponibilă (wdp) și înălțimea (hdp).

kotlin
// Definirea configurației dispozitivului în 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()
        }
    }
}

Structura resurselor pentru diferite ecrane: res/layout/activity_main.xml (telefon), res/layout-sw600dp/activity_main.xml (tabletă 7"), res/layout-sw720dp/activity_main.xml (tabletă 10"). Android selectează automat layout-ul corect pe baza smallestWidth – lățimea minimă a ecranului în dp independent de orientare. Calificatorul swdp – cea mai stabilă metodă de adaptare.

kotlin
// Jetpack Compose — WindowSizeClass pentru adaptare
@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 (biblioteca androidx.window) oferă WindowSizeClass cu trei categorii de lățime: COMPACT (0–600 dp), MEDIUM (600–840 dp), EXPANDED (>840 dp). Aceasta este o alternativă modernă la folderele vechi de calificatori. Recomandată de Google pentru adaptarea la dispozitive pliabile și tablete.

Grilă adaptivă și breakpoints

Grila adaptivă este baza responsive design. În loc de dimensiuni fixe, elementele folosesc proporții procentuale, constrângeri flexibile și intrinsic content size. Breakpoints – puncte de lățime a ecranului la atingerea cărora layout-ul comută între stări.

BreakpointiOS Size ClassAndroid QualifierTip dispozitiv
0–374 pt / dpCompact widthiPhone SE, Android vechi
375–599 pt / dpCompact widthsw320dpiPhone 14, Galaxy S24
600–839 pt / dpRegular widthsw600dpiPad mini, tablete 7"
840+ pt / dpRegular widthsw720dpiPad Pro, tablete 10"

Breakpoints recomandați de Google Material Design și Apple HIG: 0–599 dp (telefon, o coloană), 600–839 dp (tabletă, două coloane, navigation rail), 840+ dp (tabletă, trei coloane, navigation drawer). Numărul de breakpoints nu trebuie să depășească 4 – prea multe puncte de tranziție complică întreținerea și testarea.

Cele mai bune practici de design adaptiv

Un responsive design de succes necesită respectarea unui set de reguli elaborate de comunitatea dezvoltatorilor iOS și Android în ultimul deceniu. Mai jos sunt recomandările cheie bazate pe Apple HIG, Google Material Design și experiența proiectelor de producție.

  • Începeți cu cel mai mic ecran – proiectați layout-ul pentru iPhone SE (375 pt) sau Android compact (360 dp), apoi adăugați extensii pentru ecrane mai mari. Aceasta garantează că conținutul critic se încadrează peste tot
  • Folosiți intrinsic content size – UILabel, UIButton, ImageView au dimensiune naturală. Auto Layout și ConstraintLayout îl folosesc pentru poziționare automată fără constrângeri inutile
  • Nu ascundeți conținutul pe ecrane mici – în loc de ascundere, rearanjați (reflow). Utilizatorul trebuie să aibă acces la aceeași funcționalitate, doar într-o altă ordine
  • Testați pe toate size classes – simulatorul iOS permite comutarea Size Classes fără repornire. Emulatorul Android oferă diferite profiluri de dispozitive. Testați obligatoriu pe tablete și dispozitive pliabile
  • Material 3 Adaptive Layout – Google oferă canonical layouts gata făcute pentru listă/detalii, panouri de instrumente și navigare. Folosiți-le în loc să inventați propriile modele

Principalul principiu al designului adaptiv: conținutul determină layout-ul, nu invers. Dacă pe iPad se afișează același stack de carduri ca pe iPhone, doar întins pe lățime – acesta nu este responsive design. Responsive design regândește compoziția: pe iPhone – scroll vertical, pe iPad – master-detail cu panou lateral.

Întrebări frecvente

Cu ce diferă Responsive Design de Adaptive Layout?

Responsive Design folosește o grilă flexibilă care se adaptează treptat la lățimea ecranului. Adaptive Layout comută între layout-uri fixe la punctele breakpoint. În practică, ambele abordări se combină: grila de bază responsive + comutări adaptive pentru schimbări cardinale (telefon vs tabletă).

Ce Size Classes există în iOS?

iOS folosește două axe: orizontală (Compact/Regular) și verticală (Compact/Regular). iPhone în portret – Compact width, Regular height (CR). iPad – Regular width, Regular height (RR). iPhone Plus/Pro Max în peisaj – Regular width, Compact height (RC). Dezvoltatorul stabilește variații de constrângeri pentru fiecare combinație.

Ce este sw600dp în Android?

sw600dp (smallestWidth 600 dp) – un calificator de resurse Android care înseamnă că lățimea minimă a ecranului dispozitivului este de cel puțin 600 dp. Folosit pentru încărcarea layout-urilor alternative pentru tablete (7" și mai mari). Orientarea nu contează – sw ia în considerare cea mai mică latură a ecranului.

Cum se testează adaptabilitatea aplicației?

Pe iOS folosiți simulatorul cu diferite Size Classes și Preview în SwiftUI cu dispozitive de diferite dimensiuni. Pe Android – profiluri de dispozitive în emulator (Pixel 5, Pixel C, Galaxy Tab) și Layout Validation în Android Studio. Pe ambele platforme testați obligatoriu pe un iPad/Android tablet fizic și un dispozitiv pliabil.

Ce sunt canonical layouts în Material Design?

Canonical layouts – modele gata făcute de compoziție adaptivă de la Google Material Design 3: list-detail (listă + detalii), feed (flux de carduri), supporting pane (conținut principal + panou de acțiuni). Fiecare model are trei variante (compact/medium/expanded) și se adaptează automat la WindowSizeClass.

Rezumat

  • Responsive Design – adaptarea layout-ului la dimensiunea și orientarea ecranului prin grile flexibile și breakpoints
  • Size Classes în iOS (Compact/Regular) determină layout-ul pentru iPhone, iPad și Split View
  • Configuration Qualifiers în Android (swdp, wdp, layout-land) încarcă resurse pentru dispozitiv
  • Jetpack WindowManager oferă WindowSizeClass cu trei categorii: COMPACT, MEDIUM, EXPANDED
  • Breakpoints: 0–599 dp (telefon), 600–839 dp (tabletă), 840+ dp (tabletă lată)
  • Responsive ≠ simpla întindere – se cere rearanjarea elementelor (reflow), nu ascunderea conținutului
  • Testarea pe toate tipurile de dispozitive, inclusiv tablete și pliabile, este o etapă obligatorie de dezvoltare

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.

Discutați proiectul

Citiți și