Wir zeigen, was Safe Area ist — die sichere Bildschirmzone, die garantiert, dass Inhalte nicht von Systemelementen überlagert werden: Notch, Dynamic Island, StatusBar, Home-Indikator und abgerundete Ecken. Safe Area ist ein obligatorisches Element des adaptiven Layouts in iOS und Android, ohne das die Benutzeroberfläche auf Geräten mit Ausschnitten falsch aussehen kann. Laut Apple HIG (2025) müssen seit der Einführung des iPhone X im Jahr 2017 alle Anwendungen das Safe Area Layout Guide verwenden.
Wichtige Erkenntnisse
Safe Area ist ein rechteckiger Bereich des Bildschirms, in dem Inhalte garantiert nicht von Hardware- und Software-Systemelementen überlagert werden: Kameraausschnitt (Notch), Dynamic Island, Statusleiste (StatusBar), Gesten-Navigationsindikator (Home Indicator), abgerundete Displayecken und Navigationsleiste. Die Grenzen der Safe Area ändern sich dynamisch beim Drehen des Geräts, Aufrufen der Tastatur oder Starten von Split View. Laut den Apple Human Interface Guidelines (2025) gilt das Ignorieren der Safe Area als Designfehler und kann zur Ablehnung der App bei der Überprüfung führen.
Safe Area löst das Problem der Bildschirmfragmentierung im mobilen Ökosystem. Vor dem iPhone X hatten alle iPhones ein rechteckiges Display mit denselben Proportionen. Mit dem Aufkommen des Notch stieg die Anzahl der Bildschirmvarianten auf über 20 — verschiedene Notch-Größen, Dynamic Island, abgerundete Ecken, Indikatoren. Safe Area abstrahiert den Entwickler von diesen Unterschieden, indem es eine einheitliche API für adaptive Abstände bereitstellt. Laut Apple Developer (2025) wendet iOS Safe Area automatisch auf die Root-View an, aber UICollectionView und UIScrollView erfordern manuelle Konfiguration.
| Gerät | Ausschnitt-Typ | Oberer Abstand | Unterer Abstand | StatusBar |
|---|---|---|---|---|
| iPhone SE (3rd gen) | Keiner | 20px | 0px | Ja |
| iPhone 13 Pro | Notch | 47px | 34px | Im Notch |
| iPhone 14 Pro | Dynamic Island | 59px | 34px | In DI |
| iPhone 16 Pro | Dynamic Island | 59px | 34px | In DI |
| Android Pixel 8 | Punch-hole (Kamera) | 24px | 24px | Statusleiste |
In iOS wird Safe Area durch SafeAreaLayoutGuide in UIKit und den safeAreaInset-Modifikator in SwiftUI implementiert. SafeAreaLayoutGuide ist ein Layout-Guide, der zu jeder UIView hinzugefügt wird und das von Systemelementen freie Rechteck definiert. Im Interface Builder wird Safe Area als blauer Bereich angezeigt. SwiftUI wendet Safe Area automatisch für die meisten Container an, erlaubt aber das Ignorieren über .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 definiert vier Anker — oben, unten, Anfang, Ende — die automatisch den Notch, StatusBar und Home Indicator berücksichtigen. Dieser Ansatz funktioniert auf allen iOS-Geräten ab iOS 11. In SwiftUI wird derselbe Effekt durch den Content-Modifikator innerhalb von NavigationStack oder VStack erzielt — SwiftUI wendet automatisch Safe Area Insets an.
// SwiftUI: safeAreaInset und ignoresSafeArea
ZStack {
Color.blue
.ignoresSafeArea()
VStack {
Text("Inhalt in Safe Area")
.foregroundColor(.white)
Spacer()
}
}
.safeAreaInset(edge: .bottom) {
Text("Leiste am unteren Bildschirmrand")
.padding()
.background(.thinMaterial)
}
In SwiftUI ermöglicht .ignoresSafeArea() dem Hintergrund, sich über die Safe Area hinaus zu erstrecken, während .safeAreaInset(edge:) ein benutzerdefiniertes Panel hinzufügt, das die Safe Area auf der angegebenen Seite reduziert. Dies ist ein Standardmuster für Navigationsleisten, Symbolleisten und Werbebanner.
In Android wird Safe Area durch WindowInsets (API 30+) und WindowInsetsCompat (AndroidX-Bibliothek) implementiert. WindowInsets bietet Abstände für die Status Bar, Navigation Bar, IME (Tastatur) und Systemgesten. Ab Android 10 (API 29) empfiehlt Google die Verwendung von WindowInsetsCompat.getInsets() mit WindowInsetsCompat.Type.systemBars(), um einen einheitlichen Satz von Abständen für alle Systemelemente zu erhalten.
// 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 diesem Beispiel gibt WindowInsets die Abstände für alle Systemleisten zurück — Status Bar oben, Navigation Bar unten. setOnApplyWindowInsetsListener wird jedes Mal aufgerufen, wenn sich die Abstände ändern (Drehung, Tastaturaufruf). Die Methode systemBars() kombiniert die Statusleiste, Navigationsleiste und Anpassungsleiste zu einem einzigen Satz, was den Code vereinfacht.
Ab Android 15 verlangt Google Edge-to-Edge-Darstellung für alle Anwendungen, die auf die neue API abzielen. Dies bedeutet, dass die Anwendung unter den Systemleisten zeichnet und Safe Area über handleWindowInsets oder WindowInsetController angewendet wird. Laut Android Developer Blog (2025) sind bereits 68% der Anwendungen auf Edge-to-Edge umgestiegen, was die visuelle Wahrnehmung auf Geräten mit großen Bildschirmen verbessert.
Safe Area, Padding und Insets sind verwandte, aber unterschiedliche Konzepte. Safe Area ist der Bildschirmbereich, der garantiert frei von Systemelementen ist. Padding ist der innere Abstand eines Elements von seinen Grenzen. Insets sind spezifische numerische Versatzwerte, die von der Safe Area API zurückgegeben werden. Laut Apple Tech Notes (2025) ist die Verwechslung von Safe Area und Padding die Ursache für 40% der Anpassungsprobleme in App Stores.
| Konzept | Definition | Plattform | Veränderbarkeit |
|---|---|---|---|
| Safe Area | Bereich ohne Systemelemente | iOS, Android | Dynamisch |
| Padding | Innerer Abstand innerhalb einer View | Alle Plattformen | Statisch |
| Layout Margins | Abstand von Layout-Kanten | iOS (UIKit) | Statisch/dynamisch |
| WindowInsets | Systemabstände in Android | Android | Dynamisch |
Betrachten wir typische Szenarien: Safe Area in UIKit für Querformat mit Notch, Safe Area in SwiftUI mit einem benutzerdefinierten Panel, Safe Area in Android Compose. Beispiel für iOS UIKit — Platzieren einer Sammlung innerhalb der Safe Area auf einem iPhone mit Dynamic Island. Beispiel für Jetpack Compose — Verwendung von WindowInsets in Material 3.
// Jetpack Compose: Safe Area-Abstände
@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("Inhalt in Safe Area")
}
}
}
In Jetpack Compose berücksichtigt Scaffold automatisch WindowInsets über den Parameter contentWindowInsets. InnerPadding wird an den Inhalt übergeben und auf innere Elemente angewendet. Column mit dem Modifikator padding(innerPadding) stellt sicher, dass Text nicht unter Systemleisten gerät.
Laut einer App Store Review-Analyse von Apple (2025) sind die fünf häufigsten Fehler: Ignorieren der Safe Area im Querformat, Verwendung hartcodierter Abstände anstelle von SafeAreaLayoutGuide, falsche Safe Area-Behandlung in UIScrollView, vergessene Abstände in modalen Präsentationen und fehlende Anpassung für Dynamic Island. Hartcodierte Abstände (fest 20px oben) sind der häufigste Fehler: Auf einem iPhone 14 Pro werden aus diesen 20px 59px, und der Inhalt wird abgeschnitten.
Häufig gestellte Fragen
In SwiftUI wird Safe Area automatisch auf die meisten Container angewendet. Zum Lesen der Abstände verwenden Sie EnvironmentValues: @Environment(\.safeAreaInsets) var safeAreaInsets. Für benutzerdefinierte Panels verwenden Sie .safeAreaInset(edge:content:). Für Hintergründe, die sich unter Systemelemente erstrecken sollen, wenden Sie .ignoresSafeArea() an.
Edge-to-Edge ist ein Anzeigemodus, bei dem die Anwendung unter den Systemleisten (Status Bar, Navigation Bar) zeichnet und Safe Area über WindowInsets angewendet wird. Ab Android 15 verlangt Google Edge-to-Edge für alle Anwendungen mit targetSdk 35. Es wird über WindowInsetsCompat oder handleWindowInsets in Jetpack Compose implementiert.
Ja, WebView muss ebenfalls die Safe Area berücksichtigen. Verwenden Sie in iOS webView.scrollView.contentInsetAdjustmentBehavior = .always. Fügen Sie in Android android:fitsSystemWindows="true" im XML hinzu oder programmatisches Padding über ViewCompat.setOnApplyWindowInsetsListener. Die CSS-Umgebung (env(safe-area-inset-top)) funktioniert in Safari, aber nicht in Android-System-WebViews.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch