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 é 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.
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.
| Dispositivo | Tipo de recorte | Margem superior | Margem inferior | StatusBar |
|---|---|---|---|---|
| iPhone SE (3rd gen) | Nenhum | 20px | 0px | Sim |
| iPhone 13 Pro | Notch | 47px | 34px | Dentro do notch |
| iPhone 14 Pro | Dynamic Island | 59px | 34px | Dentro do DI |
| iPhone 16 Pro | Dynamic Island | 59px | 34px | Dentro do DI |
| Android Pixel 8 | Punch-hole (câmera) | 24px | 24px | Barra de status |
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().
// 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.
// 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.
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.
// 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.
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 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.
| Conceito | Definição | Plataforma | Mutabilidade |
|---|---|---|---|
| Safe Area | Área sem elementos do sistema | iOS, Android | Dinâmica |
| Padding | Margem interna dentro de uma visualização | Todas as plataformas | Estática |
| Layout Margins | Margens das bordas do layout | iOS (UIKit) | Estática/dinâmica |
| WindowInsets | Margens do sistema no Android | Android | Dinâmica |
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.
// 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.
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.
Perguntas frequentes
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().
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.
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
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.
Leia também