We laten zien wat Safe Area is — de veilige zone van het scherm die garandeert dat inhoud niet wordt bedekt door systeemelementen: notch, Dynamic Island, StatusBar, Home-indicator en afgeronde hoeken. Safe Area is een verplicht onderdeel van adaptieve lay-out in iOS en Android, zonder welke de interface er onjuist kan uitzien op apparaten met uitsparingen. Volgens Apple HIG (2025) moeten alle apps sinds de introductie van de iPhone X in 2017 de Safe Area Layout Guide gebruiken.
Belangrijkste punten
Safe Area — is een rechthoekig schermgebied waarin de inhoud gegarandeerd niet wordt bedekt door hardware- en software-systeemelementen: de camera-uitsparing (notch), Dynamic Island, de statusbalk (StatusBar), de navigatie-indicator voor gebaren (Home Indicator), afgeronde schermhoeken en het navigatiepaneel. De grenzen van Safe Area veranderen dynamisch bij draaien van het apparaat, oproepen van het toetsenbord of starten van Split View. Volgens Apple Human Interface Guidelines (2025) wordt het negeren van Safe Area beschouwd als een ontwerpfout en kan leiden tot afwijzing van de app tijdens de review.
Safe Area lost het probleem van schermfragmentatie in het mobiele ecosysteem op. Vóór de iPhone X hadden alle iPhones een rechthoekig scherm met dezelfde verhoudingen. Met de komst van notch groeide het aantal schermvarianten tot 20+ — verschillende maten uitsparingen, Dynamic Island, afrondingen, indicatoren. Safe Area abstraheert de ontwikkelaar van deze verschillen door een uniforme API voor adaptieve afstanden te bieden. Volgens Apple Developer (2025) past iOS automatisch Safe Area toe voor de root view, maar voor UICollectionView en UIScrollView is handmatige configuratie vereist.
| Apparaat | Type uitsparing | Bovenste afstand | Onderste afstand | StatusBar |
|---|---|---|---|---|
| iPhone SE (3rd gen) | Geen | 20px | 0px | Ja |
| iPhone 13 Pro | Notch | 47px | 34px | In notch |
| iPhone 14 Pro | Dynamic Island | 59px | 34px | In DI |
| iPhone 16 Pro | Dynamic Island | 59px | 34px | In DI |
| Android Pixel 8 | Punch-hole (camera) | 24px | 24px | Statusbalk |
In iOS wordt Safe Area geïmplementeerd via SafeAreaLayoutGuide in UIKit en de safeAreaInset-modifier in SwiftUI. SafeAreaLayoutGuide is een lay-outgids die aan elke UIView wordt toegevoegd en de rechthoek vrij van systeemelementen definieert. In Interface Builder wordt Safe Area weergegeven als een blauw gebied. SwiftUI past Safe Area automatisch toe voor de meeste containers, maar staat toe deze te negeren via .ignoresSafeArea().
// UIKit: SafeAreaLayoutGuide
let safeGuide = view.safeAreaLayoutGuide
button.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
button.topAnchor.constraint(
equalTo: safeGuide.topAnchor),
button.leadingAnchor.constraint(
equalTo: safeGuide.leadingAnchor),
button.trailingAnchor.constraint(
equalTo: safeGuide.trailingAnchor),
])
SafeAreaLayoutGuide in UIKit definieert vier anchors — top, bottom, leading, trailing — die automatisch rekening houden met notch, StatusBar en Home Indicator. Deze aanpak werkt op alle iOS-apparaten vanaf iOS 11. In SwiftUI wordt hetzelfde effect bereikt via de inhoudsmodifier binnen NavigationStack of VStack — SwiftUI past automatisch Safe Area Insets toe.
// SwiftUI: safeAreaInset en ignoresSafeArea
ZStack {
Color.blue
.ignoresSafeArea()
VStack {
Text("Inhoud in Safe Area")
.foregroundColor(.white)
Spacer()
}
}
.safeAreaInset(edge: .bottom) {
Text("Balk onderaan het scherm")
.padding()
.background(.thinMaterial)
}
In SwiftUI zorgt .ignoresSafeArea() ervoor dat de achtergrond buiten Safe Area kan uitstrekken, en .safeAreaInset(edge:) voegt een aangepast paneel toe dat Safe Area aan de aangegeven kant verkleint. Dit is het standaard patroon voor navigatiepanelen, werkbalken en advertentiebanners.
In Android wordt Safe Area geïmplementeerd via WindowInsets (API 30+) en WindowInsetsCompat (AndroidX-bibliotheek). WindowInsets biedt afstanden voor Status Bar, Navigation Bar, IME (toetsenbord) en systeemgebaren. Vanaf Android 10 (API 29) beveelt Google aan om WindowInsetsCompat.getInsets() te gebruiken met het type WindowInsetsCompat.Type.systemBars() om een uniforme set afstanden voor alle systeemelementen te verkrijgen.
// Android: WindowInsets (Kotlin)
class MainActivity : AppCompatActivity() {
override fun onCreate(
savedInstanceState: Bundle?
) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
ViewCompat.setOnApplyWindowInsetsListener(
findViewById(R.id.main_content)
) { view, insets ->
val systemBars = insets.getInsets(
WindowInsetsCompat.Type.systemBars()
)
view.setPadding(
systemBars.left,
systemBars.top,
systemBars.right,
systemBars.bottom
)
ViewCompat.ON_APPLY_WINDOW_INSETS_LISTENER
}
}
}
In dit voorbeeld retourneert WindowInsets afstanden voor alle systeembalken — Status Bar boven, Navigation Bar onder. setOnApplyWindowInsetsListener wordt elke keer aangeroepen wanneer insets veranderen (draaien, toetsenbordoproep). De methode systemBars() combineert de statusbalk, navigatiebalk en aanpassingsbalk in één set, wat de code vereenvoudigt.
Vanaf Android 15 vereist Google edge-to-edge weergave voor alle apps die de nieuwe API targeten. Dit betekent dat de app onder de systeembalken wordt getekend en Safe Area wordt toegepast via handleWindowInsets of WindowInsetController. Volgens Android Developer Blog (2025) is 68% van de apps al overgestapt op edge-to-edge, wat de visuele perceptie op apparaten met grote schermen verbetert.
Safe Area, Padding en Insets — gerelateerde maar verschillende concepten. Safe Area is het schermgebied dat gegarandeerd vrij is van systeemelementen. Padding is de binnenste afstand van een element vanaf zijn grenzen. Insets zijn de specifieke numerieke afstandswaarden die door de Safe Area API worden geretourneerd. Volgens Apple Tech Notes (2025) is verwarring tussen Safe Area en Padding de oorzaak van 40% van de aanpasbaarheidsproblemen in app-winkels.
| Concept | Definitie | Platform | Veranderlijkheid |
|---|---|---|---|
| Safe Area | Gebied zonder systeemelementen | iOS, Android | Dynamisch |
| Padding | Binnenste afstand binnen view | Alle platforms | Statisch |
| Layout Margins | Afstand van layout randen | iOS (UIKit) | Statisch/dynamisch |
| WindowInsets | Systeemafstanden Android | Android | Dynamisch |
Laten we typische scenario's bekijken: Safe Area in UIKit voor horizontale oriëntatie met notch, Safe Area in SwiftUI met aangepast paneel, Safe Area in Android Compose. Voorbeeld voor iOS UIKit — plaatsing van een collectie binnen Safe Area op iPhone met Dynamic Island. Voorbeeld voor Jetpack Compose — gebruik van WindowInsets in Material 3.
// Jetpack Compose: afstanden van Safe Area
@OptIn(ExperimentalMaterial3Api::class)
fun SafeAreaScreen() {
val systemBars = with(
LocalDensity.current
) {
val insets = WindowInsets
.systemBars
.getAsPaddingValues()
PaddingValues(
top = insets.calculateTopPadding(),
bottom = insets.calculateBottomPadding()
)
}
Scaffold(
contentWindowInsets = WindowInsets(
top = systemBars.computeTopPadding(),
bottom = systemBars.computeBottomPadding()
)
) { innerPadding ->
Column(
modifier = Modifier
.padding(innerPadding)
) {
Text("Inhoud in Safe Area")
}
}
}
In Jetpack Compose houdt Scaffold automatisch rekening met WindowInsets via de parameter contentWindowInsets. InnerPadding wordt doorgegeven aan content en toegepast op interne elementen. Column met de modifier padding(innerPadding) garandeert dat tekst niet onder de systeembalken terechtkomt.
Volgens een analyse van App Store Review door Apple (2025) zijn de vijf meest voorkomende fouten: het negeren van Safe Area in horizontale oriëntatie, het gebruik van hardgecodeerde afstanden in plaats van SafeAreaLayoutGuide, onjuiste verwerking van Safe Area in UIScrollView, vergeten afstanden in modale presentaties en het ontbreken van aanpassing voor Dynamic Island. Hardgecodeerde afstanden (hardcoded 20px bovenaan) — de meest voorkomende fout: op iPhone 14 Pro worden deze 20px 59px en wordt de inhoud afgesneden.
Veelgestelde vragen
In SwiftUI wordt Safe Area automatisch toegepast op de meeste containers. Gebruik EnvironmentValues om afstanden te lezen: @Environment(.safeAreaInsets) var safeAreaInsets. Gebruik .safeAreaInset(edge:content:) voor aangepaste panelen. Voor achtergrond die onder systeemelementen moet uitstrekken, pas .ignoresSafeArea() toe.
Edge-to-edge — een weergavemodus waarbij de app onder systeembalken (Status Bar, Navigation Bar) wordt getekend en Safe Area wordt toegepast via WindowInsets. Vanaf Android 15 vereist Google edge-to-edge voor alle apps met targetSdk 35. Het wordt geïmplementeerd via WindowInsetsCompat of handleWindowInsets in Jetpack Compose.
Ja, WebView moet ook rekening houden met Safe Area. Gebruik in iOS webView.scrollView.contentInsetAdjustmentBehavior = .always. Voeg in Android android:fitsSystemWindows="true" toe in XML of programmatische padding via ViewCompat.setOnApplyWindowInsetsListener. De CSS-omgeving (env(safe-area-inset-top)) werkt in Safari, maar niet in systeem-WebViews van Android.
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