Safe Area — cos'è, margini dal notch e StatusBar

Autore: IT Sectr Pubblicato: 2026-02-25 Tempo di lettura: 8 min

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 — l'area dello schermo libera da elementi di sistema: notch, StatusBar, Home Indicator, angoli arrotondati.
  • In iOS, Safe Area è implementata tramite SafeAreaLayoutGuide e il modificatore .safeAreaInset() in SwiftUI.
  • In Android, Safe Area è implementata tramite WindowInsets e WindowInsetsCompat per la retrocompatibilità.
  • Dynamic Island su iPhone 14 Pro e successivi sostituisce il notch e viene anch'essa considerata in Safe Area.
  • Secondo Google Android Docs (2025), ignorare Safe Area è una delle tre principali cause di rifiuto delle app su Google Play e App Store.

Cos'è Safe Area?

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.

Perché Safe Area è necessaria

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.

DispositivoTipo di ritaglioMargine superioreMargine inferioreStatusBar
iPhone SE (3a gen.)Nessuno20px0px
iPhone 13 ProNotch47px34pxDentro il notch
iPhone 14 ProDynamic Island59px34pxDentro DI
iPhone 16 ProDynamic Island59px34pxDentro DI
Android Pixel 8Punch-hole (fotocamera)24px24pxBarra di stato

Safe Area in iOS: SafeAreaLayoutGuide e SwiftUI

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().

Swift
// 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.

Swift
// 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.

Safe Area in Android: WindowInsets e System Bars

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.

Kotlin
// 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.

Edge-to-Edge in Android

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: qual è la differenza

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.

ConcettoDefinizionePiattaformaModificabilità
Safe AreaArea senza elementi di sistemaiOS, AndroidDinamica
PaddingMargine interno all'interno di una vistaTutte le piattaformeStatico
Layout MarginsMargini dai bordi del layoutiOS (UIKit)Statico/dinamico
WindowInsetsMargini di sistema in AndroidAndroidDinamico

Esempi di implementazione di Safe Area con codice

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.

Kotlin
// 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.

Errori comuni quando si lavora con Safe Area

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.

  • Ignorare l'orizzontale — in orientamento orizzontale, Safe Area ha margini diversi: l'Home Indicator si sposta sul lato destro e il margine superiore diminuisce.
  • Margini hardcoded — valori di 20px o 44px funzionano solo su vecchi iPhone senza notch. Sui dispositivi moderni, i margini differiscono di 2-3 volte.
  • ScrollView e Safe Area — contentInsetAdjustmentBehavior in UIScrollView deve essere impostato su .always, altrimenti il contenuto sarà nascosto sotto le barre di sistema.

Domande frequenti

Come ottenere i margini di Safe Area in SwiftUI?

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().

Cos'è l'edge-to-edge in Android?

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.

Devo gestire Safe Area per WebView?

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

  • Safe Area — l'area dello schermo libera da notch, Dynamic Island, StatusBar e Home Indicator.
  • iOS: implementata tramite SafeAreaLayoutGuide in UIKit e .safeAreaInset in SwiftUI.
  • Android: implementata tramite WindowInsets (API 30+) o WindowInsetsCompat (AndroidX).
  • Dynamic Island su iPhone 14 Pro e successivi aumenta il margine superiore di Safe Area a 59px.
  • Ignorare Safe Area è una delle principali cause di rifiuto delle app su App Store e Google Play.
  • I margini hardcoded non sono accettabili — utilizzare sempre le API programmatiche di Safe Area.

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.

Discuti il progetto

Leggi anche