Safe Area — o que é, margens do notch e StatusBar

Autor: IT Sectr Publicado: 2026-02-25 Tempo de leitura: 8 min

Mostramos o que é Safe Area — a zona segura da tela que garante que o conteúdo não seja sobreposto por elementos do sistema: notch, Dynamic Island, StatusBar, indicador Home e cantos arredondados. Safe Area é um elemento obrigatório do layout adaptável em iOS e Android, sem o qual a interface pode parecer incorreta em dispositivos com recortes. De acordo com a Apple HIG (2025), desde o lançamento do iPhone X em 2017, todos os aplicativos devem usar o Safe Area Layout Guide.

Principais conclusões

  • Safe Area — a área da tela livre de elementos do sistema: notch, StatusBar, Home Indicator, cantos arredondados.
  • No iOS, a Safe Area é implementada através do SafeAreaLayoutGuide e do modificador .safeAreaInset() no SwiftUI.
  • No Android, a Safe Area é implementada através do WindowInsets e do WindowInsetsCompat para compatibilidade com versões anteriores.
  • O Dynamic Island no iPhone 14 Pro e posteriores substitui o notch e também é considerado na Safe Area.
  • De acordo com o Google Android Docs (2025), ignorar a Safe Area é uma das três principais causas de rejeição de aplicativos no Google Play e App Store.

O que é Safe Area?

Safe Area é uma área retangular da tela onde o conteúdo não é sobreposto por elementos do sistema de hardware e software: recorte da câmera (notch), Dynamic Island, barra de status (StatusBar), indicador de navegação por gestos (Home Indicator), cantos arredondados da tela e barra de navegação. Os limites da Safe Area mudam dinamicamente ao girar o dispositivo, invocar o teclado ou iniciar o Split View. De acordo com as Apple Human Interface Guidelines (2025), ignorar a Safe Area é considerado um erro de design e pode levar à rejeição do aplicativo durante a revisão.

Por que a Safe Area é necessária

Safe Area resolve o problema de fragmentação de telas no ecossistema móvel. Antes do iPhone X, todos os iPhones tinham uma tela retangular com as mesmas proporções. Com o advento do notch, o número de variantes de tela cresceu para mais de 20 — diferentes tamanhos de notch, Dynamic Island, cantos arredondados, indicadores. A Safe Area abstrai o desenvolvedor dessas diferenças, fornecendo uma API unificada para margens adaptativas. De acordo com a Apple Developer (2025), o iOS aplica a Safe Area automaticamente à visualização raiz, mas UICollectionView e UIScrollView exigem configuração manual.

DispositivoTipo de recorteMargem superiorMargem inferiorStatusBar
iPhone SE (3rd gen)Nenhum20px0pxSim
iPhone 13 ProNotch47px34pxDentro do notch
iPhone 14 ProDynamic Island59px34pxDentro do DI
iPhone 16 ProDynamic Island59px34pxDentro do DI
Android Pixel 8Punch-hole (câmera)24px24pxBarra de status

Safe Area no iOS: SafeAreaLayoutGuide e SwiftUI

No iOS, a Safe Area é implementada através do SafeAreaLayoutGuide no UIKit e do modificador safeAreaInset no SwiftUI. SafeAreaLayoutGuide é um guia de layout adicionado a cada UIView que define o retângulo livre de elementos do sistema. No Interface Builder, a Safe Area é exibida como uma área azul. O SwiftUI aplica a Safe Area automaticamente para a maioria dos contêineres, mas permite ignorá-la através de .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 no UIKit define quatro âncoras — superior, inferior, inicial, final — que consideram automaticamente o notch, StatusBar e Home Indicator. Esta abordagem funciona em todos os dispositivos iOS a partir do iOS 11. No SwiftUI, o mesmo efeito é alcançado através do modificador de conteúdo dentro de NavigationStack ou VStack — o SwiftUI aplica automaticamente Safe Area Insets.

Swift
// SwiftUI: safeAreaInset e ignoresSafeArea
ZStack {
    Color.blue
        .ignoresSafeArea()
    VStack {
        Text("Conteúdo na Safe Area")
            .foregroundColor(.white)
        Spacer()
    }
}
.safeAreaInset(edge: .bottom) {
    Text("Barra na parte inferior da tela")
        .padding()
        .background(.thinMaterial)
}

No SwiftUI, .ignoresSafeArea() permite que o fundo se estenda além da Safe Area, enquanto .safeAreaInset(edge:) adiciona um painel personalizado que reduz a Safe Area no lado especificado. Este é um padrão padrão para barras de navegação, barras de ferramentas e banners de publicidade.

Safe Area no Android: WindowInsets e System Bars

No Android, a Safe Area é implementada através de WindowInsets (API 30+) e WindowInsetsCompat (biblioteca AndroidX). WindowInsets fornece margens para a Status Bar, Navigation Bar, IME (teclado) e gestos do sistema. A partir do Android 10 (API 29), o Google recomenda usar WindowInsetsCompat.getInsets() com WindowInsetsCompat.Type.systemBars() para obter um conjunto unificado de margens para todos os elementos do 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
        }
    }
}

Neste exemplo, WindowInsets retorna as margens para todas as barras do sistema — Status Bar no topo, Navigation Bar na parte inferior. setOnApplyWindowInsetsListener é chamado sempre que as margens mudam (rotação, invocação do teclado). O método systemBars() combina a barra de status, barra de navegação e barra de personalização em um único conjunto, simplificando o código.

Edge-to-Edge no Android

A partir do Android 15, o Google exibe edge-to-edge para todos os aplicativos direcionados à nova API. Isso significa que o aplicativo desenha sob as barras do sistema e a Safe Area é aplicada através de handleWindowInsets ou WindowInsetController. De acordo com o Android Developer Blog (2025), 68% dos aplicativos já adotaram o edge-to-edge, melhorando a percepção visual em dispositivos com telas grandes.

Safe Area, Padding e Insets: qual a diferença

Safe Area, Padding e Insets são conceitos relacionados, mas diferentes. Safe Area é a área da tela livre de elementos do sistema. Padding é a margem interna de um elemento a partir de suas bordas. Insets são valores numéricos específicos de deslocamento retornados pela API Safe Area. De acordo com Apple Tech Notes (2025), a confusão entre Safe Area e Padding é a causa de 40% dos problemas de adaptabilidade nas lojas de aplicativos.

ConceitoDefiniçãoPlataformaMutabilidade
Safe AreaÁrea sem elementos do sistemaiOS, AndroidDinâmica
PaddingMargem interna dentro de uma visualizaçãoTodas as plataformasEstática
Layout MarginsMargens das bordas do layoutiOS (UIKit)Estática/dinâmica
WindowInsetsMargens do sistema no AndroidAndroidDinâmica

Exemplos de implementação de Safe Area com código

Vamos considerar cenários típicos: Safe Area no UIKit para orientação paisagem com notch, Safe Area no SwiftUI com um painel personalizado, Safe Area no Android Compose. Exemplo para iOS UIKit — colocar uma coleção dentro da Safe Area em um iPhone com Dynamic Island. Exemplo para Jetpack Compose — usar WindowInsets no Material 3.

Kotlin
// Jetpack Compose: margens da 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("Conteúdo na Safe Area")
        }
    }
}

No Jetpack Compose, Scaffold considera automaticamente WindowInsets através do parâmetro contentWindowInsets. InnerPadding é passado para o conteúdo e aplicado aos elementos internos. Column com o modificador padding(innerPadding) garante que o texto não fique sob as barras do sistema.

Erros comuns ao trabalhar com Safe Area

De acordo com uma análise da App Store Review da Apple (2025), os cinco erros mais comuns são: ignorar a Safe Area na orientação paisagem, usar margens fixas em vez de SafeAreaLayoutGuide, manipulação incorreta da Safe Area no UIScrollView, margens esquecidas em apresentações modais e falta de adaptação para Dynamic Island. Margens fixas (20px fixos no topo) é o erro mais comum: em um iPhone 14 Pro, esses 20px se tornam 59px e o conteúdo é cortado.

  • Ignorar paisagem — na orientação paisagem, a Safe Area tem margens diferentes: o Home Indicator se desloca para o lado direito e a margem superior diminui.
  • Margens fixas — valores de 20px ou 44px só funcionam em iPhones antigos sem notch. Em dispositivos modernos, as margens diferem em 2-3 vezes.
  • ScrollView e Safe Area — contentInsetAdjustmentBehavior no UIScrollView precisa ser definido como .always, caso contrário o conteúdo ficará oculto sob as barras do sistema.

Perguntas frequentes

Como obter as margens da Safe Area no SwiftUI?

No SwiftUI, Safe Area é aplicada automaticamente à maioria dos contêineres. Para ler as margens, use EnvironmentValues: @Environment(\.safeAreaInsets) var safeAreaInsets. Para painéis personalizados, use .safeAreaInset(edge:content:). Para fundos que devem se estender sob elementos do sistema, aplique .ignoresSafeArea().

O que é edge-to-edge no Android?

Edge-to-edge é um modo de exibição onde o aplicativo desenha sob as barras do sistema (Status Bar, Navigation Bar) e a Safe Area é aplicada através do WindowInsets. A partir do Android 15, o Google exige edge-to-edge para todos os aplicativos com targetSdk 35. É implementado através de WindowInsetsCompat ou handleWindowInsets no Jetpack Compose.

Preciso lidar com Safe Area para WebView?

Sim, WebView também deve considerar a Safe Area. No iOS, use webView.scrollView.contentInsetAdjustmentBehavior = .always. No Android, adicione android:fitsSystemWindows="true" no XML ou padding programático através de ViewCompat.setOnApplyWindowInsetsListener. O ambiente CSS (env(safe-area-inset-top)) funciona no Safari, mas não nos WebViews do sistema Android.

Resumo

  • Safe Area — a área da tela livre de notch, Dynamic Island, StatusBar e Home Indicator.
  • iOS: implementado através de SafeAreaLayoutGuide no UIKit e .safeAreaInset no SwiftUI.
  • Android: implementado através de WindowInsets (API 30+) ou WindowInsetsCompat (AndroidX).
  • Dynamic Island no iPhone 14 Pro e posteriores aumenta a margem superior da Safe Area para 59px.
  • Ignorar a Safe Area é uma das principais causas de rejeição de aplicativos na App Store e Google Play.
  • Margens fixas não são aceitáveis — sempre use as APIs programáticas da Safe Area.

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também