Responsive Design – een benadering voor het bouwen van interfaces waarbij de lay-out zich automatisch aanpast aan de grootte, oriëntatie en het type apparaat. In mobiele ontwikkeling wordt responsive design geïmplementeerd via size classes in iOS en configuration qualifiers in Android. Het artikel behandelt de principes van adaptieve lay-out, tools van beide platforms en codevoorbeelden.
Belangrijkste
Responsive Design – een methode voor het bouwen van interfaces waarbij de lay-out reageert op de schermgrootte, oriëntatie en beschikbare ruimte door elementen te herschikken zonder functionaliteitsverlies. De term werd in 2010 door Ethan Marcotte voorgesteld voor webdesign, maar de principes zijn volledig van toepassing op native mobiele applicaties.
In mobiele ontwikkeling betekent responsive design dat dezelfde applicatie correct wordt weergegeven op alle apparaten: van iPhone SE (375 pt) tot iPad Pro (1024 pt in portret) en van Android-smartphone (360 dp) tot tablet (800 dp). De belangrijkste elementen zijn flexibel raster (flexible grid), adaptieve afbeeldingen en media queries op framework-niveau (size classes, qualifiers).
Volgens Apple Developer Documentation moet de applicatie universeel zijn – werkend op alle apparaten zonder aparte compilatie voor iPad. Google Play beveelt het gebruik van adaptive layouts via Jetpack WindowManager en canonical layouts aan. Gebrek aan aanpassing aan tablets is een veelvoorkomende oorzaak van negatieve beoordelingen.
De termen responsive en adaptive worden vaak verward, hoewel ze verschillende benaderingen beschrijven. Responsive design gebruikt een flexibel raster dat continu aanpast aan de schermbreedte. Adaptive design gebruikt vaste lay-outs voor vooraf gedefinieerde breakpoints – de applicatie schakelt schoksgewijs tussen deze lay-outs.
| Kenmerk | Responsive Design | Adaptive Design |
|---|---|---|
| Benadering | Continue stroom | Discrete schakelingen |
| Raster | Procentueel, fluid | Vast voor elke breakpoint |
| Implementatie | Auto Layout, Flexbox, ConstraintLayout | Size Classes, layout-w600dp, aparte storyboards |
| Aantal ontwerplay-outs | Eén, maar flexibel | Meerdere (phone portrait, phone landscape, tablet) |
In de praktijk gebruiken mobiele applicaties een combinatie van beide benaderingen. Het basisraster wordt responsive gebouwd (Auto Layout met constraint-afhankelijkheden), en bij het bereiken van een breakpoint (bijv. breedte > 600 pt) schakelt de lay-out over naar een adaptieve versie met een andere compositie. iOS combineert Auto Layout (responsive) met Size Classes (adaptive). Android combineert ConstraintLayout (responsive) met qualifier-bronnen (adaptive).
Size Classes – iOS-mechanisme dat de beschikbare schermruimte classificeert op twee assen: horizontaal en verticaal. Elke as kan Compact (C) of Regular (R) zijn. De combinatie geeft vier varianten voor lay-outaanpassing: CR (normale iPhone portret), RR (iPad portret/landschap), RC (iPhone landschap op Plus/Pro Max), CC (iPad Split View).
// Size Classes definiëren in 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 tonen
case (.compact, .regular):
showStackedView() // iPhone portret — stack lay-out
case (.compact, .compact):
showCompactView() // iPhone SE landschap — geminimaliseerd
default:
showDefaultView()
}
}
private func showSplitView() {
// We gebruiken UISplitViewController of HStack
}
private func showStackedView() {
// Verticale stack voor iPhone
}
private func showCompactView() {
// Verberg secundaire elementen, toon hoofd elementen
}
}In Interface Builder worden Size Classes geconfigureerd via het paneel „wAny hAny” – de ontwikkelaar selecteert een specifieke combinatie (wRegular hRegular, wCompact hRegular) en voegt constraint-variaties toe. SwiftUI gebruikt @Environment(\.horizontalSizeClass) en @Environment(\.verticalSizeClass) voor reactieve aanpassing – bij verandering van oriëntatie of venstergrootte hertekent SwiftUI automatisch de view.
// Size Classes in SwiftUI
import SwiftUI
struct ResponsiveView: View {
@Environment(\.horizontalSizeClass) private var hSizeClass
var body: some View {
if hSizeClass == .regular {
// iPad — horizontale lay-out met zijpaneel
HStack {
SidebarView()
.frame(width: 300)
ContentView()
}
} else {
// iPhone — verticale stack op volledig scherm
VStack {
ContentView()
}
}
}
}Configuration Qualifiers – Android-mechanisme voor het laden van verschillende bronnen (layout, values, drawables) afhankelijk van de apparaatkenmerken. De kwalificatoren omvatten schermgrootte (small, normal, large, xlarge), oriëntatie (port, land), minimale breedte (sw
// Apparaatconfiguratie definiëren in 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()
}
}
}Bronstructuur voor verschillende schermen: res/layout/activity_main.xml (telefoon), res/layout-sw600dp/activity_main.xml (tablet 7"), res/layout-sw720dp/activity_main.xml (tablet 10"). Android selecteert automatisch de juiste lay-out op basis van smallestWidth – de minimale schermbreedte in dp ongeacht oriëntatie. De sw
// Jetpack Compose — WindowSizeClass voor aanpassing
@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 (bibliotheek androidx.window) biedt WindowSizeClass met drie breedtecategorieën: COMPACT (0–600 dp), MEDIUM (600–840 dp), EXPANDED (>840 dp). Dit is een modern alternatief voor oude qualifier-mappen. Aanbevolen door Google voor aanpassing aan opvouwbare apparaten en tablets.
Het adaptieve raster is de basis van responsive design. In plaats van vaste afmetingen gebruiken elementen procentuele verhoudingen, flexibele beperkingen en intrinsic content size. Breakpoints – schermbreedtepunten waarbij de lay-out tussen statussen schakelt.
| Breakpoint | iOS Size Class | Android Qualifier | Apparaattype |
|---|---|---|---|
| 0–374 pt / dp | Compact width | — | iPhone SE, oude Android |
| 375–599 pt / dp | Compact width | sw320dp | iPhone 14, Galaxy S24 |
| 600–839 pt / dp | Regular width | sw600dp | iPad mini, tablets 7" |
| 840+ pt / dp | Regular width | sw720dp | iPad Pro, tablets 10" |
Aanbevolen breakpoints volgens Google Material Design en Apple HIG: 0–599 dp (telefoon, één kolom), 600–839 dp (tablet, twee kolommen, navigation rail), 840+ dp (tablet, drie kolommen, navigation drawer). Het aantal breakpoints mag niet meer dan 4 bedragen – te veel overgangspunten compliceren onderhoud en testen.
Succesvol responsive design vereist het naleven van een reeks regels die de afgelopen tien jaar door de iOS- en Android-ontwikkelaarsgemeenschap zijn ontwikkeld. Hieronder staan de belangrijkste aanbevelingen op basis van Apple HIG, Google Material Design en ervaring met productieprojecten.
Het belangrijkste principe van adaptief ontwerp: inhoud bepaalt de lay-out, niet andersom. Als op iPad dezelfde stapel kaarten wordt weergegeven als op iPhone, maar gewoon uitgerekt in de breedte – dan is dat geen responsive design. Responsive design heroverweegt de compositie: op iPhone – verticaal scrollen, op iPad – master-detail met zijpaneel.
Veelgestelde vragen
Responsive Design gebruikt een flexibel raster dat geleidelijk aanpast aan de schermbreedte. Adaptive Layout schakelt tussen vaste lay-outs op breakpoint-punten. In de praktijk worden beide benaderingen gecombineerd: een responsive basisraster + adaptieve schakelingen voor ingrijpende veranderingen (telefoon vs tablet).
iOS gebruikt twee assen: horizontaal (Compact/Regular) en verticaal (Compact/Regular). iPhone in portret – Compact width, Regular height (CR). iPad – Regular width, Regular height (RR). iPhone Plus/Pro Max in landschap – Regular width, Compact height (RC). De ontwikkelaar stelt constraint-variaties in voor elke combinatie.
sw600dp (smallestWidth 600 dp) – een Android-bronkwalificator die aangeeft dat de minimale schermbreedte van het apparaat ten minste 600 dp is. Gebruikt voor het laden van alternatieve lay-outs voor tablets (7" en groter). Oriëntatie maakt geen verschil – sw houdt rekening met de kleinste zijde van het scherm.
Gebruik op iOS de simulator met verschillende Size Classes en Preview in SwiftUI met apparaten van verschillende formaten. Op Android – apparaatprofielen in de emulator (Pixel 5, Pixel C, Galaxy Tab) en Layout Validation in Android Studio. Test op beide platforms verplicht op een fysieke iPad/Android-tablet en een opvouwbaar apparaat.
Canonical layouts – kant-en-klare adaptieve compositiepatronen van Google Material Design 3: list-detail (lijst + details), feed (kaartenfeed), supporting pane (hoofdinhoud + actiepaneel). Elk patroon heeft drie varianten (compact/medium/expanded) en past zich automatisch aan de WindowSizeClass aan.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook