Safe Area — qué es, márgenes del notch y StatusBar

Autor: IT Sectr Publicado: 2026-02-25 Tiempo de lectura: 8 min

Mostramos qué es Safe Area — la zona segura de pantalla que garantiza que el contenido no sea superpuesto por elementos del sistema: notch, Dynamic Island, StatusBar, indicador Home y esquinas redondeadas. Safe Area es un elemento obligatorio del diseño adaptable en iOS y Android, sin el cual la interfaz puede verse incorrecta en dispositivos con recortes. Según Apple HIG (2025), desde la aparición del iPhone X en 2017, todas las aplicaciones deben usar Safe Area Layout Guide.

Conclusiones clave

  • Safe Area — el área de pantalla libre de elementos del sistema: notch, StatusBar, Home Indicator, esquinas redondeadas.
  • En iOS, Safe Area se implementa mediante SafeAreaLayoutGuide y el modificador .safeAreaInset() en SwiftUI.
  • En Android, Safe Area se implementa mediante WindowInsets y WindowInsetsCompat para compatibilidad con versiones anteriores.
  • Dynamic Island en iPhone 14 Pro y posteriores reemplaza el notch y también se considera en Safe Area.
  • Según Google Android Docs (2025), ignorar Safe Area es una de las tres principales causas de rechazo de aplicaciones en Google Play y App Store.

¿Qué es Safe Area?

Safe Area es un área rectangular de la pantalla donde el contenido no se superpone con elementos del sistema de hardware y software: recorte de cámara (notch), Dynamic Island, barra de estado (StatusBar), indicador de navegación por gestos (Home Indicator), esquinas redondeadas de la pantalla y barra de navegación. Los límites de Safe Area cambian dinámicamente al girar el dispositivo, invocar el teclado o iniciar Split View. Según las Apple Human Interface Guidelines (2025), ignorar Safe Area se considera un error de diseño y puede provocar el rechazo de la aplicación durante la revisión.

Por qué es necesaria Safe Area

Safe Area resuelve el problema de la fragmentación de pantallas en el ecosistema móvil. Antes del iPhone X, todos los iPhones tenían una pantalla rectangular con las mismas proporciones. Con la llegada del notch, el número de variantes de pantalla creció a más de 20 — diferentes tamaños de notch, Dynamic Island, esquinas redondeadas, indicadores. Safe Area abstrae al desarrollador de estas diferencias proporcionando una API unificada para márgenes adaptativos. Según Apple Developer (2025), iOS aplica Safe Area automáticamente a la vista raíz, pero UICollectionView y UIScrollView requieren configuración manual.

DispositivoTipo de recorteMargen superiorMargen inferiorStatusBar
iPhone SE (3rd gen)Ninguno20px0px
iPhone 13 ProNotch47px34pxDentro del notch
iPhone 14 ProDynamic Island59px34pxDentro de DI
iPhone 16 ProDynamic Island59px34pxDentro de DI
Android Pixel 8Punch-hole (cámara)24px24pxBarra de estado

Safe Area en iOS: SafeAreaLayoutGuide y SwiftUI

En iOS, Safe Area se implementa mediante SafeAreaLayoutGuide en UIKit y el modificador safeAreaInset en SwiftUI. SafeAreaLayoutGuide es una guía de diseño que se agrega a cada UIView y define el rectángulo libre de elementos del sistema. En Interface Builder, Safe Area se muestra como un área azul. SwiftUI aplica Safe Area automáticamente para la mayoría de los contenedores, pero permite ignorarla mediante .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 en UIKit define cuatro anclajes — superior, inferior, inicial, final — que tienen en cuenta automáticamente el notch, StatusBar y Home Indicator. Este enfoque funciona en todos los dispositivos iOS a partir de iOS 11. En SwiftUI, el mismo efecto se logra mediante el modificador de contenido dentro de NavigationStack o VStack — SwiftUI aplica automáticamente Safe Area Insets.

Swift
// SwiftUI: safeAreaInset e ignoresSafeArea
ZStack {
    Color.blue
        .ignoresSafeArea()
    VStack {
        Text("Contenido en Safe Area")
            .foregroundColor(.white)
        Spacer()
    }
}
.safeAreaInset(edge: .bottom) {
    Text("Barra en la parte inferior de la pantalla")
        .padding()
        .background(.thinMaterial)
}

En SwiftUI, .ignoresSafeArea() permite que el fondo se extienda más allá de Safe Area, mientras que .safeAreaInset(edge:) agrega un panel personalizado que reduce Safe Area en el lado especificado. Este es un patrón estándar para barras de navegación, barras de herramientas y banners publicitarios.

Safe Area en Android: WindowInsets y System Bars

En Android, Safe Area se implementa mediante WindowInsets (API 30+) y WindowInsetsCompat (biblioteca AndroidX). WindowInsets proporciona márgenes para la Status Bar, Navigation Bar, IME (teclado) y gestos del sistema. A partir de Android 10 (API 29), Google recomienda usar WindowInsetsCompat.getInsets() con WindowInsetsCompat.Type.systemBars() para obtener un conjunto unificado de márgenes para todos los elementos del 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
        }
    }
}

En este ejemplo, WindowInsets devuelve los márgenes para todas las barras del sistema — Status Bar arriba, Navigation Bar abajo. setOnApplyWindowInsetsListener se llama cada vez que cambian los márgenes (rotación, invocación del teclado). El método systemBars() combina la barra de estado, la barra de navegación y la barra de personalización en un solo conjunto, simplificando el código.

Edge-to-Edge en Android

A partir de Android 15, Google requiere la visualización edge-to-edge para todas las aplicaciones que apuntan a la nueva API. Esto significa que la aplicación se dibuja debajo de las barras del sistema y Safe Area se aplica mediante handleWindowInsets o WindowInsetController. Según Android Developer Blog (2025), el 68% de las aplicaciones ya han adoptado edge-to-edge, mejorando la percepción visual en dispositivos con pantallas grandes.

Safe Area, Padding e Insets: ¿cuál es la diferencia?

Safe Area, Padding e Insets son conceptos relacionados pero diferentes. Safe Area es el área de pantalla libre de elementos del sistema. Padding es el margen interno de un elemento desde sus bordes. Insets son valores numéricos específicos de desplazamiento devueltos por la API de Safe Area. Según Apple Tech Notes (2025), la confusión entre Safe Area y Padding es la causa del 40% de los problemas de adaptabilidad en las tiendas de aplicaciones.

ConceptoDefiniciónPlataformaMutabilidad
Safe AreaÁrea sin elementos del sistemaiOS, AndroidDinámica
PaddingMargen interno dentro de una vistaTodas las plataformasEstática
Layout MarginsMárgenes desde los bordes del diseñoiOS (UIKit)Estática/dinámica
WindowInsetsMárgenes del sistema en AndroidAndroidDinámica

Ejemplos de implementación de Safe Area con código

Consideremos escenarios típicos: Safe Area en UIKit para orientación horizontal con notch, Safe Area en SwiftUI con un panel personalizado, Safe Area en Android Compose. Ejemplo para iOS UIKit — colocar una colección dentro de Safe Area en un iPhone con Dynamic Island. Ejemplo para Jetpack Compose — usar WindowInsets en Material 3.

Kotlin
// Jetpack Compose: márgenes de 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("Contenido en Safe Area")
        }
    }
}

En Jetpack Compose, Scaffold tiene en cuenta automáticamente WindowInsets mediante el parámetro contentWindowInsets. InnerPadding se pasa al contenido y se aplica a los elementos internos. Column con el modificador padding(innerPadding) garantiza que el texto no quede debajo de las barras del sistema.

Errores comunes al trabajar con Safe Area

Según un análisis de App Store Review de Apple (2025), los cinco errores más comunes son: ignorar Safe Area en orientación horizontal, usar márgenes fijos en lugar de SafeAreaLayoutGuide, manejo incorrecto de Safe Area en UIScrollView, márgenes olvidados en presentaciones modales y falta de adaptación para Dynamic Island. Márgenes fijos (20px fijos arriba) es el error más común: en un iPhone 14 Pro, esos 20px se convierten en 59px y el contenido se recorta.

  • Ignorar la orientación horizontal — en orientación horizontal, Safe Area tiene diferentes márgenes: el Home Indicator se desplaza al lado derecho y el margen superior disminuye.
  • Márgenes fijos — los valores de 20px o 44px solo funcionan en iPhones antiguos sin notch. En dispositivos modernos, los márgenes difieren 2-3 veces.
  • ScrollView y Safe Area — contentInsetAdjustmentBehavior en UIScrollView debe configurarse en .always, de lo contrario el contenido quedará oculto debajo de las barras del sistema.

Preguntas frecuentes

¿Cómo obtener los márgenes de Safe Area en SwiftUI?

En SwiftUI, Safe Area se aplica automáticamente a la mayoría de los contenedores. Para leer los márgenes, use EnvironmentValues: @Environment(\.safeAreaInsets) var safeAreaInsets. Para paneles personalizados, use .safeAreaInset(edge:content:). Para fondos que deben extenderse debajo de los elementos del sistema, aplique .ignoresSafeArea().

¿Qué es edge-to-edge en Android?

Edge-to-edge es un modo de visualización donde la aplicación se dibuja debajo de las barras del sistema (Status Bar, Navigation Bar) y Safe Area se aplica mediante WindowInsets. A partir de Android 15, Google requiere edge-to-edge para todas las aplicaciones con targetSdk 35. Se implementa mediante WindowInsetsCompat o handleWindowInsets en Jetpack Compose.

¿Es necesario manejar Safe Area para WebView?

Sí, WebView también debe tener en cuenta Safe Area. En iOS, use webView.scrollView.contentInsetAdjustmentBehavior = .always. En Android, agregue android:fitsSystemWindows="true" en XML o padding programático mediante ViewCompat.setOnApplyWindowInsetsListener. El entorno CSS (env(safe-area-inset-top)) funciona en Safari pero no en los WebView del sistema Android.

Resumen

  • Safe Area — el área de pantalla libre de notch, Dynamic Island, StatusBar y Home Indicator.
  • iOS: implementado mediante SafeAreaLayoutGuide en UIKit y .safeAreaInset en SwiftUI.
  • Android: implementado mediante WindowInsets (API 30+) o WindowInsetsCompat (AndroidX).
  • Dynamic Island en iPhone 14 Pro y posteriores aumenta el margen superior de Safe Area a 59px.
  • Ignorar Safe Area es una de las principales causas de rechazo de aplicaciones en App Store y Google Play.
  • Los márgenes fijos no son aceptables — use siempre las API programáticas de Safe Area.

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también