Mostriamo cos'è Safe Area — la zona sicura dello schermo che garantisce che il contenuto non venga sovrapposto da elementi di sistema: notch, Dynamic Island, StatusBar, indicatore Home e angoli arrotondati. Safe Area è un elemento obbligatorio del layout adattivo in iOS e Android, senza il quale l'interfaccia potrebbe apparire scorretta su dispositivi con ritagli. Secondo Apple HIG (2025), dall'introduzione di iPhone X nel 2017, tutte le applicazioni devono utilizzare Safe Area Layout Guide.
Punti chiave
Safe Area è un'area rettangolare dello schermo in cui il contenuto non viene sovrapposto da elementi di sistema hardware e software: ritaglio della fotocamera (notch), Dynamic Island, barra di stato (StatusBar), indicatore di navigazione gestuale (Home Indicator), angoli arrotondati del display e barra di navigazione. I confini di Safe Area cambiano dinamicamente quando si ruota il dispositivo, si richiama la tastiera o si avvia Split View. Secondo le Apple Human Interface Guidelines (2025), ignorare Safe Area è considerato un difetto di progettazione e può portare al rifiuto dell'app durante la revisione.
Safe Area risolve il problema della frammentazione degli schermi nell'ecosistema mobile. Prima di iPhone X, tutti gli iPhone avevano un display rettangolare con le stesse proporzioni. Con l'avvento del notch, il numero di varianti di schermo è cresciuto a oltre 20 — diverse dimensioni di notch, Dynamic Island, angoli arrotondati, indicatori. Safe Area astrae lo sviluppatore da queste differenze fornendo un'API unificata per margini adattivi. Secondo Apple Developer (2025), iOS applica automaticamente Safe Area alla vista radice, ma UICollectionView e UIScrollView richiedono configurazione manuale.
| Dispositivo | Tipo di ritaglio | Margine superiore | Margine inferiore | StatusBar |
|---|---|---|---|---|
| iPhone SE (3a gen.) | Nessuno | 20px | 0px | Sì |
| iPhone 13 Pro | Notch | 47px | 34px | Dentro il notch |
| iPhone 14 Pro | Dynamic Island | 59px | 34px | Dentro DI |
| iPhone 16 Pro | Dynamic Island | 59px | 34px | Dentro DI |
| Android Pixel 8 | Punch-hole (fotocamera) | 24px | 24px | Barra di stato |
In iOS, Safe Area è implementata tramite SafeAreaLayoutGuide in UIKit e il modificatore safeAreaInset in SwiftUI. SafeAreaLayoutGuide è una guida di layout aggiunta a ogni UIView che definisce il rettangolo libero da elementi di sistema. In Interface Builder, Safe Area viene visualizzata come un'area blu. SwiftUI applica Safe Area automaticamente per la maggior parte dei contenitori, ma consente di ignorarla tramite .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 definisce quattro ancore — superiore, inferiore, iniziale, finale — che tengono automaticamente conto del notch, StatusBar e Home Indicator. Questo approccio funziona su tutti i dispositivi iOS a partire da iOS 11. In SwiftUI, lo stesso effetto si ottiene tramite il modificatore di contenuto all'interno di NavigationStack o VStack — SwiftUI applica automaticamente Safe Area Insets.
// SwiftUI: safeAreaInset e ignoresSafeArea
ZStack {
Color.blue
.ignoresSafeArea()
VStack {
Text("Contenuto in Safe Area")
.foregroundColor(.white)
Spacer()
}
}
.safeAreaInset(edge: .bottom) {
Text("Barra in fondo allo schermo")
.padding()
.background(.thinMaterial)
}
In SwiftUI, .ignoresSafeArea() consente allo sfondo di estendersi oltre Safe Area, mentre .safeAreaInset(edge:) aggiunge un pannello personalizzato che riduce Safe Area sul lato specificato. Questo è un modello standard per barre di navigazione, barre degli strumenti e banner pubblicitari.
In Android, Safe Area è implementata tramite WindowInsets (API 30+) e WindowInsetsCompat (libreria AndroidX). WindowInsets fornisce margini per Status Bar, Navigation Bar, IME (tastiera) e gesti di sistema. A partire da Android 10 (API 29), Google raccomanda di utilizzare WindowInsetsCompat.getInsets() con WindowInsetsCompat.Type.systemBars() per ottenere un insieme unificato di margini per tutti gli elementi di sistema.
// 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 questo esempio, WindowInsets restituisce i margini per tutte le barre di sistema — Status Bar in alto, Navigation Bar in basso. setOnApplyWindowInsetsListener viene chiamato ogni volta che i margini cambiano (rotazione, richiamo della tastiera). Il metodo systemBars() combina la barra di stato, la barra di navigazione e la barra di personalizzazione in un unico insieme, semplificando il codice.
A partire da Android 15, Google richiede la visualizzazione edge-to-edge per tutte le applicazioni che targettizzano la nuova API. Ciò significa che l'applicazione disegna sotto le barre di sistema e Safe Area viene applicata tramite handleWindowInsets o WindowInsetController. Secondo Android Developer Blog (2025), il 68% delle applicazioni è già passato all'edge-to-edge, migliorando la percezione visiva sui dispositivi con schermi grandi.
Safe Area, Padding e Insets sono concetti correlati ma diversi. Safe Area è l'area dello schermo garantita libera da elementi di sistema. Padding è il margine interno di un elemento dai suoi bordi. Insets sono specifici valori numerici di offset restituiti dall'API Safe Area. Secondo Apple Tech Notes (2025), la confusione tra Safe Area e Padding è la causa del 40% dei problemi di adattabilità negli store di app.
| Concetto | Definizione | Piattaforma | Modificabilità |
|---|---|---|---|
| Safe Area | Area senza elementi di sistema | iOS, Android | Dinamica |
| Padding | Margine interno all'interno di una vista | Tutte le piattaforme | Statico |
| Layout Margins | Margini dai bordi del layout | iOS (UIKit) | Statico/dinamico |
| WindowInsets | Margini di sistema in Android | Android | Dinamico |
Consideriamo scenari tipici: Safe Area in UIKit per orientamento orizzontale con notch, Safe Area in SwiftUI con un pannello personalizzato, Safe Area in Android Compose. Esempio per iOS UIKit — posizionare una collezione all'interno di Safe Area su un iPhone con Dynamic Island. Esempio per Jetpack Compose — utilizzare WindowInsets in Material 3.
// Jetpack Compose: margini 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("Contenuto in Safe Area")
}
}
}
In Jetpack Compose, Scaffold tiene automaticamente conto di WindowInsets tramite il parametro contentWindowInsets. InnerPadding viene passato al contenuto e applicato agli elementi interni. Column con il modificatore padding(innerPadding) garantisce che il testo non finisca sotto le barre di sistema.
Secondo un'analisi di App Store Review di Apple (2025), i cinque errori più comuni sono: ignorare Safe Area in orientamento orizzontale, utilizzare margini hardcoded invece di SafeAreaLayoutGuide, gestione errata di Safe Area in UIScrollView, margini dimenticati in presentazioni modali e mancanza di adattamento per Dynamic Island. Margini hardcoded (20px fissi in alto) è l'errore più comune: su un iPhone 14 Pro, quei 20px diventano 59px e il contenuto viene tagliato.
Domande frequenti
In SwiftUI, Safe Area viene applicata automaticamente alla maggior parte dei contenitori. Per leggere i margini, utilizzare EnvironmentValues: @Environment(\.safeAreaInsets) var safeAreaInsets. Per pannelli personalizzati, utilizzare .safeAreaInset(edge:content:). Per sfondi che devono estendersi sotto gli elementi di sistema, applicare .ignoresSafeArea().
Edge-to-edge è una modalità di visualizzazione in cui l'applicazione disegna sotto le barre di sistema (Status Bar, Navigation Bar) e Safe Area viene applicata tramite WindowInsets. A partire da Android 15, Google richiede edge-to-edge per tutte le applicazioni con targetSdk 35. Viene implementato tramite WindowInsetsCompat o handleWindowInsets in Jetpack Compose.
Sì, anche WebView deve considerare Safe Area. In iOS, utilizzare webView.scrollView.contentInsetAdjustmentBehavior = .always. In Android, aggiungere android:fitsSystemWindows="true" nell'XML o padding programmatico tramite ViewCompat.setOnApplyWindowInsetsListener. L'ambiente CSS (env(safe-area-inset-top)) funziona in Safari ma non nei WebView di sistema Android.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche