Full Screen Cover é um estilo de apresentação modal no iOS onde a nova tela ocupa todo o display sem visibilidade do conteúdo pai. Ao contrário do Page Sheet, o Full Screen Cover oculta completamente a tela anterior e é usado para conteúdo de mídia, editores de foto e telas de autorização. De acordo com Apple Developer, 2025, este estilo era o padrão até o iOS 13, mas continua sendo o preferido para cenários imersivos. No SwiftUI, o modificador .fullScreenCover fornece uma API declarativa para apresentação em tela cheia.
Principais pontos
Full Screen Cover é um estilo de apresentação modal no iOS onde o controlador apresentado ocupa toda a tela do dispositivo. O conteúdo pai é completamente ocultado, criando um efeito imersivo e focando o usuário na tarefa atual.
Antes do iOS 13, o Full Screen Cover era o único estilo de apresentação modal no iPhone. Todas as chamadas a present(_:animated:completion:) usavam .fullScreen por padrão. A partir do iOS 13, a Apple mudou o estilo padrão para .automatic, que para o iPhone seleciona .pageSheet. No entanto, o Full Screen Cover continua disponível e é usado para cenários onde o foco total é importante.
Ao contrário do Page Sheet, o Full Screen Cover não permite interagir com o conteúdo pai nem o mostra sob a janela modal. O usuário não pode fechar o Full Screen Cover deslizando para baixo — o fechamento requer uma chamada programática a dismiss(animated:completion:) ou um botão de fechar na própria tela. Este comportamento é importante de considerar ao projetar a UX.
Page Sheet é o segundo estilo principal de apresentação modal, introduzido no iOS 13. O Page Sheet é exibido como um cartão com margem superior, sob o qual a tela pai é visível. O usuário pode fechar o Page Sheet deslizando para baixo. O Full Screen Cover, ao contrário, oculta o conteúdo pai e não suporta fechamento por deslize.
| Característica | Full Screen Cover | Page Sheet |
|---|---|---|
| Cobertura de fundo | Total, conteúdo pai não visível | Parcial, pai visível sob o cartão |
| Fechamento por deslize | Não, apenas programaticamente ou por botão | Sim, deslizar para baixo fecha |
| Uso típico | Vídeo, câmera, editor de foto, PDF | Formulários, configurações, visualização detalhada |
| Animação de apresentação | De baixo para cima, tela cheia | De baixo para cima, cartão com margem |
| Disponibilidade | iOS 2+ | iOS 13+ |
A escolha entre Full Screen Cover e Page Sheet depende do conteúdo e contexto. É recomendado usar Full Screen Cover para conteúdo que requer atenção total: vídeo em tela cheia, pré-visualização de fotos, digitalização de documentos. Page Sheet é para tarefas onde o contexto da tela pai é importante: formulários de edição, seleção de opções, visualização de detalhes.
UIKit fornece a constante UIModalPresentationStyle.fullScreen para configurar o estilo de apresentação modal. Definir esta propriedade no UIViewController antes de chamar present garante que o controlador seja exibido em tela cheia. O controlador também gerencia o comportamento quando o teclado aparece e lida com eventos do sistema.
Após definir o estilo .fullScreen, recomenda-se configurar presentationController?.delegate para lidar com eventos de fechamento. O delegate UIAdaptivePresentationControllerDelegate permite interceptar tentativas de fechamento e evitar perda de dados. Ao contrário do Page Sheet, para Full Screen Cover o delegate só é acionado em chamadas programáticas de dismiss.
O Full Screen Cover lida corretamente com rotação de tela e aparecimento do teclado. Ao girar, o controlador modal se adapta automaticamente à nova orientação. UIKeyboardWillShowNotification permite deslocar o conteúdo para cima quando o teclado aparece, mantendo os campos de texto visíveis. Ao contrário do Page Sheet, o Full Screen Cover não altera seu tamanho quando o teclado aparece.
let playerVC = VideoPlayerViewController()
playerVC.modalPresentationStyle = .fullScreen
playerVC.modalTransitionStyle = .crossDissolve
present(playerVC, animated: true) {
playerVC.startPlayback()
}
// Dispensar
dismiss(animated: true) {
print("Player dispensado")
}
SwiftUI fornece o modificador .fullScreenCover para criação declarativa de janelas modais em tela cheia. Ao contrário de .sheet (Page Sheet), .fullScreenCover cria o estilo .fullScreen com comportamento semelhante: cobertura total do conteúdo e sem fechamento por deslize.
O modificador aceita um binding para Bool ou um item identificável opcional. Quando o binding é definido como true, o SwiftUI anima o aparecimento da janela em tela cheia. Para passar dados, use o parâmetro onDismiss e uma closure com conteúdo. O valor de ambiente \.dismiss permite fechar a janela modal internamente.
A escolha entre .fullScreenCover e .sheet no SwiftUI é análoga ao UIKit: .fullScreenCover para conteúdo imersivo, .sheet para cartões. SwiftUI seleciona automaticamente o comportamento de fechamento correto: .sheet pode ser fechado por deslize, .fullScreenCover apenas programaticamente. Os modificadores podem ser combinados em uma mesma hierarquia de View.
struct CameraView: View {
@State private var showCamera = false
var body: some View {
Button("Abrir câmera") {
showCamera = true
}
.fullScreenCover(isPresented: $showCamera) {
CameraPreviewView()
.ignoresSafeArea()
}
}
}
struct CameraPreviewView: View {
@Environment(\.dismiss) private var dismiss
var body: some View {
ZStack {
Color.black.ignoresSafeArea()
VStack {
Spacer()
Button("Capturar") { dismiss() }
.foregroundColor(.white)
}
}
}
}
Full Screen Cover suporta animações personalizadas através de UIModalTransitionStyle no UIKit e transições personalizadas no SwiftUI. Os estilos padrão incluem: .coverVertical (de baixo para cima), .crossDissolve (aparecimento gradual), .flipHorizontal (virar) e .partialCurl (efeito de página).
Para animação totalmente personalizada, implemente o protocolo UIViewControllerAnimatedTransitioning. Ele permite definir a duração da animação e a própria transição através do método animateTransition(using:). O controlador de animação é atribuído através de UINavigationControllerDelegate ou UIViewControllerTransitioningDelegate.
No SwiftUI, transições personalizadas para .fullScreenCover são criadas usando matchedGeometryEffect. Este modificador anima o movimento de um elemento da View pai para a janela em tela cheia. Por exemplo, ao tocar numa miniatura de foto, ela se expande suavemente para tela cheia, criando um efeito de continuidade. O MatchedGeometryEffect funciona com id e namespace que vinculam o elemento nas posições de origem e destino.
struct PhotoViewer: View {
@State private var selectedPhoto: String?
@Namespace private var animation
var body: some View {
HStack {
ForEach(["photo1", "photo2"], id: \.self) { photo in
Image(photo)
.matchedGeometryEffect(id: photo, in: animation)
.onTapGesture { selectedPhoto = photo }
}
}
.fullScreenCover(item: $selectedPhoto) { photo in
Image(photo)
.matchedGeometryEffect(id: photo, in: animation)
.ignoresSafeArea()
}
}
}
Full Screen Cover é recomendado para cenários onde o conteúdo deve ocupar a tela inteira sem distração da interface pai. O Apple HIG identifica três categorias principais: conteúdo de mídia, ferramentas de criação de conteúdo e interfaces temporárias do sistema.
Players de vídeo, visualização de fotos, leitura de PDF e quadrinhos são exemplos típicos de uso do Full Screen Cover. AVPlayerViewController no iOS usa automaticamente o modo tela cheia ao mudar para paisagem. Editores de foto como Adobe Lightroom abrem um editor em tela cheia sobre a biblioteca de fotos.
Câmera, scanner de documentos, gravação de voz — tarefas que exigem total atenção do usuário. UIImagePickerController usava Full Screen Cover para a câmera antes do iOS 14. A partir do iOS 14, o seletor do sistema usa Page Sheet, mas o desenvolvedor pode forçar .fullScreen para uma câmera personalizada.
Não use Full Screen Cover para: formulários de registro (Page Sheet é preferível), telas com entrada de texto onde o contexto da página pai é importante, e navegação sequencial dentro da janela modal. Material Design também recomenda evitar bloquear o botão voltar do sistema — isto é aceitável no iOS, mas o usuário deve ter uma forma clara de fechar através de um elemento de UI.
Perguntas frequentes
.fullScreen oculta o controlador pai e o remove da hierarquia de exibição. .overFullScreen exibe o controlador modal sobre o pai, mas o pai permanece na hierarquia e continua recebendo eventos. overFullScreen é útil para fundos transparentes e animações de camadas personalizadas.
A Apple mudou o estilo padrão no iOS 13 para melhorar a interação do usuário. Page Sheet permite ver o contexto da tela pai e fechar a janela modal com um deslize, o que acelera a navegação. O Full Screen Cover permanece para cenários onde é necessário foco total sem distração do fundo.
No UIKit, chame dismiss(animated:completion:) no presentingViewController ou presentedViewController. No SwiftUI, use o valor de ambiente \.dismiss e invoque-o como uma função. Para fechamento programático do controlador pai, defina o binding passado para .fullScreenCover como false.
Sim, Full Screen Cover funciona no iPad. Estilos adicionais estão disponíveis para iPad: .formSheet (janela centrada de tamanho fixo) e .currentContext (relativo ao controlador pai). No iPad, Full Screen Cover pode aparecer como Page Sheet se modalPresentationStyle não for definido explicitamente.
Ao contrário do Page Sheet, Full Screen Cover não é fechado por deslize, então a perda de dados só é possível com dismiss programático. Sobrescreva o método dismiss(animated:completion:) ou use UIAdaptivePresentationControllerDelegate, que é chamado antes do fechamento. Mostre um UIAlertController com opções: salvar, cancelar ou permanecer na tela.
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