Full Screen Cover è uno stile di presentazione modale in iOS in cui il nuovo schermo occupa l'intero display senza visibilità del contenuto padre. A differenza di Page Sheet, Full Screen Cover nasconde completamente lo schermo precedente e viene utilizzato per contenuti multimediali, editor fotografici e schermate di autorizzazione. Secondo Apple Developer, 2025, questo stile era quello predefinito fino a iOS 13, ma rimane preferito per scenari immersivi. In SwiftUI, il modificatore .fullScreenCover fornisce un'API dichiarativa per la presentazione a schermo intero.
Punti chiave
Full Screen Cover è uno stile di presentazione modale in iOS in cui il controller presentato occupa l'intero schermo del dispositivo. Il contenuto padre è completamente nascosto, creando un effetto immersivo e concentrando l'utente sull'attività corrente.
Prima di iOS 13, Full Screen Cover era l'unico stile di presentazione modale su iPhone. Tutte le chiamate a present(_:animated:completion:) utilizzavano .fullScreen per impostazione predefinita. A partire da iOS 13, Apple ha cambiato lo stile predefinito in .automatic, che per iPhone seleziona .pageSheet. Tuttavia, Full Screen Cover rimane disponibile e viene utilizzato per scenari in cui è importante la piena concentrazione.
A differenza di Page Sheet, Full Screen Cover non consente di interagire con il contenuto padre e non lo mostra sotto la finestra modale. L'utente non può chiudere Full Screen Cover scorrendo verso il basso — per chiudere è necessario chiamare dismiss(animated:completion:) o un pulsante di chiusura sullo schermo stesso. Questo comportamento è importante da considerare quando si progetta l'UX.
Page Sheet è il secondo stile principale di presentazione modale, introdotto in iOS 13. Page Sheet viene visualizzato come una scheda con un margine superiore, sotto la quale è visibile lo schermo padre. L'utente può chiudere Page Sheet scorrendo verso il basso. Full Screen Cover, al contrario, nasconde il contenuto padre e non supporta la chiusura tramite swipe.
| Caratteristica | Full Screen Cover | Page Sheet |
|---|---|---|
| Copertura sfondo | Completa, contenuto padre non visibile | Parziale, padre visibile sotto la scheda |
| Chiusura tramite swipe | No, solo tramite programma o pulsante | Sì, scorrendo verso il basso si chiude |
| Utilizzo tipico | Video, fotocamera, editor foto, PDF | Moduli, impostazioni, vista dettaglio |
| Animazione presentazione | Dal basso verso l'alto, schermo intero | Dal basso verso l'alto, scheda con margine |
| Disponibilità | iOS 2+ | iOS 13+ |
La scelta tra Full Screen Cover e Page Sheet dipende dal contenuto e dal contesto. Si consiglia di utilizzare Full Screen Cover per contenuti che richiedono piena attenzione: video a schermo intero, anteprime foto, scansione documenti. Page Sheet è per attività in cui il contesto dello schermo padre è importante: moduli di modifica, selezione opzioni, vista dettaglio.
UIKit fornisce la costante UIModalPresentationStyle.fullScreen per configurare lo stile di presentazione modale. Impostare questa proprietà su UIViewController prima di chiamare present garantisce che il controller venga visualizzato a schermo intero. Il controller gestisce anche il comportamento quando appare la tastiera e gestisce gli eventi di sistema.
Dopo aver impostato lo stile .fullScreen, si consiglia di configurare presentationController?.delegate per gestire gli eventi di chiusura. Il delegato UIAdaptivePresentationControllerDelegate consente di intercettare i tentativi di chiusura e prevenire la perdita di dati. A differenza di Page Sheet, per Full Screen Cover il delegato viene attivato solo su chiamate programmatiche a dismiss.
Full Screen Cover gestisce correttamente la rotazione dello schermo e la comparsa della tastiera. Durante la rotazione, il controller modale si adatta automaticamente al nuovo orientamento. UIKeyboardWillShowNotification consente di spostare il contenuto verso l'alto quando appare la tastiera, mantenendo visibili i campi di testo. A differenza di Page Sheet, Full Screen Cover non modifica le sue dimensioni quando appare la tastiera.
let playerVC = VideoPlayerViewController()
playerVC.modalPresentationStyle = .fullScreen
playerVC.modalTransitionStyle = .crossDissolve
present(playerVC, animated: true) {
playerVC.startPlayback()
}
// Chiudi
dismiss(animated: true) {
print("Lettore chiuso")
}
SwiftUI fornisce il modificatore .fullScreenCover per la creazione dichiarativa di finestre modali a schermo intero. A differenza di .sheet (Page Sheet), .fullScreenCover crea lo stile .fullScreen con comportamento simile: copertura totale del contenuto e assenza di chiusura tramite swipe.
Il modificatore accetta un binding a Bool o un elemento identificabile opzionale. Quando il binding viene impostato su true, SwiftUI anima la comparsa della finestra a schermo intero. Per passare dati, si utilizzano il parametro onDismiss e una closure con contenuto. Il valore di ambiente \.dismiss consente di chiudere la finestra modale dall'interno.
La scelta tra .fullScreenCover e .sheet in SwiftUI è analoga a UIKit: .fullScreenCover per contenuti immersivi, .sheet per schede. SwiftUI seleziona automaticamente il corretto comportamento di chiusura: .sheet può essere chiuso tramite swipe, .fullScreenCover solo tramite programma. I modificatori possono essere combinati in una singola gerarchia di View.
struct CameraView: View {
@State private var showCamera = false
var body: some View {
Button("Apri fotocamera") {
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("Acquisisci") { dismiss() }
.foregroundColor(.white)
}
}
}
}
Full Screen Cover supporta animazioni personalizzate tramite UIModalTransitionStyle in UIKit e transizioni personalizzate in SwiftUI. Gli stili standard includono: .coverVertical (dal basso verso l'alto), .crossDissolve (dissolvenza), .flipHorizontal (ribaltamento) e .partialCurl (effetto pagina).
Per un'animazione completamente personalizzata, implementare il protocollo UIViewControllerAnimatedTransitioning. Esso consente di definire la durata dell'animazione e la transizione stessa tramite il metodo animateTransition(using:). Il controller di animazione viene assegnato tramite UINavigationControllerDelegate o UIViewControllerTransitioningDelegate.
In SwiftUI, le transizioni personalizzate per .fullScreenCover vengono create utilizzando matchedGeometryEffect. Questo modificatore anima il movimento di un elemento dalla View padre alla finestra a schermo intero. Ad esempio, toccando una miniatura di una foto, questa si espande dolcemente a schermo intero, creando un effetto di continuità. MatchedGeometryEffect funziona con id e namespace che collegano l'elemento nelle posizioni di origine e destinazione.
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 è consigliato per scenari in cui il contenuto deve occupare l'intero schermo senza distrazioni dall'interfaccia padre. Apple HIG identifica tre categorie principali: contenuti multimediali, strumenti di creazione contenuti e interfacce di sistema temporanee.
Lettori video, visualizzazione foto, lettura PDF e fumetti sono esempi tipici di utilizzo di Full Screen Cover. AVPlayerViewController in iOS utilizza automaticamente la modalità a schermo intero quando si passa al paesaggio. Editor fotografici come Adobe Lightroom aprono un editor a schermo intero sopra la libreria fotografica.
Fotocamera, scanner documenti, registrazione vocale — attività che richiedono la piena attenzione dell'utente. UIImagePickerController utilizzava Full Screen Cover per la fotocamera prima di iOS 14. A partire da iOS 14, il selettore di sistema utilizza Page Sheet, ma lo sviluppatore può forzare .fullScreen per una fotocamera personalizzata.
Non utilizzare Full Screen Cover per: moduli di registrazione (Page Sheet è preferibile), schermate con input di testo dove il contesto della pagina padre è importante e navigazione sequenziale all'interno della finestra modale. Material Design raccomanda inoltre di evitare di bloccare il pulsante Indietro di sistema — questo è accettabile in iOS, ma l'utente deve avere un modo chiaro per chiudere tramite un elemento dell'interfaccia.
Domande frequenti
.fullScreen nasconde il controller padre e lo rimuove dalla gerarchia di visualizzazione. .overFullScreen mostra il controller modale sopra il padre, ma il padre rimane nella gerarchia e continua a ricevere eventi. overFullScreen è utile per sfondi trasparenti e animazioni di layer personalizzate.
Apple ha cambiato lo stile predefinito in iOS 13 per migliorare l'interazione con l'utente. Page Sheet consente di vedere il contesto dello schermo padre e chiudere la finestra modale con uno swipe, accelerando la navigazione. Full Screen Cover rimane per scenari in cui è necessaria la piena concentrazione senza distrazioni dallo sfondo.
In UIKit, chiamare dismiss(animated:completion:) su presentingViewController o presentedViewController. In SwiftUI, utilizzare il valore di ambiente \.dismiss e invocarlo come funzione. Per la chiusura programmatica dal controller padre, impostare il binding passato a .fullScreenCover su false.
Sì, Full Screen Cover funziona su iPad. Stili aggiuntivi sono disponibili per iPad: .formSheet (finestra centrata di dimensioni fisse) e .currentContext (relativo al controller padre). Su iPad, Full Screen Cover può apparire come Page Sheet se modalPresentationStyle non è impostato esplicitamente.
A differenza di Page Sheet, Full Screen Cover non viene chiuso tramite swipe, quindi la perdita di dati è possibile solo con dismiss programmatico. Sovrascrivere il metodo dismiss(animated:completion:) o utilizzare UIAdaptivePresentationControllerDelegate, che viene chiamato prima della chiusura. Mostrare un UIAlertController con opzioni: salvare, annullare o rimanere sullo schermo.
Riepilogo
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.
Leggi anche