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 – 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.
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 Design | Adaptive Design |
|---|---|---|
| Abordare | Flux continuu | Comutări discrete |
| Grilă | Procentuală, fluid | Fixă pentru fiecare breakpoint |
| Implementare | Auto Layout, Flexbox, ConstraintLayout | Size Classes, layout-w600dp, storyboard-uri separate |
| Număr de machete | Una, 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).
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).
// 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.
// 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()
}
}
}
}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ă (sw
// 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 sw
// 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.
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.
| Breakpoint | iOS Size Class | Android Qualifier | Tip dispozitiv |
|---|---|---|---|
| 0–374 pt / dp | Compact width | — | iPhone SE, Android vechi |
| 375–599 pt / dp | Compact width | sw320dp | iPhone 14, Galaxy S24 |
| 600–839 pt / dp | Regular width | sw600dp | iPad mini, tablete 7" |
| 840+ pt / dp | Regular width | sw720dp | iPad 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.
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.
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
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ă).
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.
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.
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.
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
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.
Citiți și