Full Screen Cover — styl modální prezentace v iOS, při kterém nová obrazovka zabírá celý displej bez viditelnosti nadřazeného obsahu. Na rozdíl od Page Sheet, Full Screen Cover zcela skrývá předchozí obrazovku a používá se pro mediální obsah, fotoeditory a autorizační obrazovky. Podle Apple Developer, 2025 byl tento styl výchozí až do iOS 13, ale zůstává preferovaný pro imerzivní scénáře. V SwiftUI poskytuje modifikátor .fullScreenCover deklarativní API pro celoobrazovkovou prezentaci.
Hlavní body
Full Screen Cover — je styl modální prezentace v iOS, při kterém prezentovaný ovladač zabírá celou obrazovku zařízení. Nadřazený obsah je zcela skryt, což vytváří imerzivní efekt a soustředí uživatele na aktuální úkol.
Před iOS 13 byl Full Screen Cover jediným stylem modální prezentace na iPhone. Všechna volání present(_:animated:completion:) ve výchozím nastavení používala .fullScreen. Od iOS 13 Apple změnil výchozí styl na .automatic, který pro iPhone volí .pageSheet. Full Screen Cover však zůstává k dispozici a používá se pro scénáře, kde je důležité plné soustředění.
Na rozdíl od Page Sheet, Full Screen Cover neumožňuje interakci s nadřazeným obsahem a nezobrazuje jej pod modálním oknem. Uživatel nemůže zavřít Full Screen Cover tahem dolů — pro zavření je vyžadováno programové volání dismiss(animated:completion:) nebo tlačítko zavření na samotné obrazovce. Toto chování je důležité zohlednit při návrhu UX.
Page Sheet — druhý hlavní styl modální prezentace, který se objevil v iOS 13. Page Sheet se zobrazuje jako karta s mezerou nahoře, pod kterou je vidět nadřazená obrazovka. Uživatel může zavřít Page Sheet tahem dolů. Full Screen Cover naopak skrývá nadřazený obsah a nepodporuje zavírání tahem.
| Vlastnost | Full Screen Cover | Page Sheet |
|---|---|---|
| Překrytí pozadí | Úplné, nadřazený obsah není vidět | Částečné, nadřazený je vidět pod kartou |
| Zavírání tahem | Ne, pouze programově nebo tlačítkem | Ano, tah dolů zavírá |
| Typické použití | Video, kamera, fotoeditor, PDF | Formuláře, nastavení, detailní prohlížení |
| Animace zobrazení | Zdola nahoru, celá obrazovka | Zdola nahoru, karta s mezerou |
| Dostupnost | iOS 2+ | iOS 13+ |
Výběr mezi Full Screen Cover a Page Sheet závisí na obsahu a kontextu. Doporučuje se používat Full Screen Cover pro obsah vyžadující plnou pozornost: video v celoobrazovkovém režimu, náhled fotografií, skenování dokumentů. Page Sheet — pro úkoly, kde je kontext nadřazené obrazovky důležitý: editační formuláře, výběr možností, prohlížení detailů.
UIKit poskytuje konstantu UIModalPresentationStyle.fullScreen pro konfiguraci stylu modální prezentace. Nastavení této vlastnosti na UIViewController před voláním present zaručuje, že se ovladač zobrazí na celou obrazovku. Ovladač také spravuje chování při zobrazení klávesnice a zpracování systémových událostí.
Po nastavení stylu .fullScreen se doporučuje nakonfigurovat presentationController?.delegate pro zpracování událostí zavření. Delegát UIAdaptivePresentationControllerDelegate umožňuje zachytit pokus o zavření a zabránit ztrátě dat. Na rozdíl od Page Sheet se pro Full Screen Cover delegát aktivuje pouze při programovém volání dismiss.
Full Screen Cover správně zpracovává rotaci obrazovky a zobrazení klávesnice. Při rotaci se modální ovladač automaticky přizpůsobí nové orientaci. UIKeyboardWillShowNotification umožňuje posunout obsah nahoru při zobrazení klávesnice, aby textová pole zůstala viditelná. Na rozdíl od Page Sheet, Full Screen Cover nemění své rozměry při zobrazení klávesnice.
let playerVC = VideoPlayerViewController()
playerVC.modalPresentationStyle = .fullScreen
playerVC.modalTransitionStyle = .crossDissolve
present(playerVC, animated: true) {
playerVC.startPlayback()
}
// Zamítnout
dismiss(animated: true) {
print("Přehrávač zamítnut")
}
SwiftUI poskytuje modifikátor .fullScreenCover pro deklarativní vytváření celoobrazovkových modálních oken. Na rozdíl od .sheet (Page Sheet), .fullScreenCover vytváří styl .fullScreen s analogickým chováním: úplné překrytí obsahu a absence zavírání tahem.
Modifikátor přijímá binding na Bool nebo volitelný identifikovatelný objekt. Při nastavení binding na true SwiftUI animuje zobrazení celoobrazovkového okna. Pro předávání dat se používá parametr onDismiss a uzávěr s obsahem. Hodnota prostředí \.dismiss umožňuje zavřít modální okno zevnitř.
Výběr mezi .fullScreenCover a .sheet v SwiftUI je analogický UIKit: .fullScreenCover pro imerzivní obsah, .sheet pro karty. SwiftUI automaticky vybírá správné chování zavírání: .sheet lze zavřít tahem, .fullScreenCover — pouze programově. Modifikátory lze kombinovat ve stejné hierarchii View.
struct CameraView: View {
@State private var showCamera = false
var body: some View {
Button("Otevřít kameru") {
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("Zachytit") { dismiss() }
.foregroundColor(.white)
}
}
}
}
Full Screen Cover podporuje vlastní animace prostřednictvím UIModalTransitionStyle v UIKit a vlastní přechody v SwiftUI. Standardní styly: .coverVertical (zdola nahoru), .crossDissolve (postupné zobrazení), .flipHorizontal (překlopení) a .partialCurl (efekt stránky).
Pro zcela vlastní animaci implementujte protokol UIViewControllerAnimatedTransitioning. Umožňuje definovat dobu trvání animace a samotný přechod prostřednictvím metody animateTransition(using:). Ovladač animace se přiřazuje prostřednictvím delegáta UINavigationControllerDelegate nebo UIViewControllerTransitioningDelegate.
V SwiftUI se vlastní přechody pro .fullScreenCover vytvářejí pomocí matchedGeometryEffect. Tento modifikátor animuje přesun prvku z nadřazeného View do celoobrazovkového okna. Například při kliknutí na miniaturu fotografie se plynule roztáhne na celou obrazovku a vytvoří efekt kontinuity. MatchedGeometryEffect pracuje s id a namespace, které spojují prvek ve zdrojové a cílové pozici.
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 se doporučuje pro scénáře, kde by měl obsah zabírat celou obrazovku bez rozptylování nadřazeným rozhraním. Apple HIG rozlišuje tři hlavní kategorie: mediální obsah, nástroje pro tvorbu obsahu a dočasná systémová rozhraní.
Videopřehrávače, prohlížení fotografií, čtení PDF a komiksů — typické příklady použití Full Screen Cover. AVPlayerViewController v iOS automaticky používá celoobrazovkový režim při přechodu do landscape. Fotoeditory jako Adobe Lightroom otevírají celoobrazovkový editor nad knihovnou snímků.
Kamera, skener dokumentů, nahrávání hlasu — úkoly vyžadující plnou pozornost uživatele. UIImagePickerController do iOS 14 používal Full Screen Cover pro kameru. Od iOS 14 systémový výběr používá Page Sheet, ale vývojář může vynutit .fullScreen pro vlastní kameru.
Nepoužívejte Full Screen Cover pro: registrační formuláře (preferován je Page Sheet), obrazovky s textovým vstupem, kde je důležitý kontext nadřazené stránky, a sekvenční navigaci uvnitř modálního okna. Material Design také doporučuje vyhnout se blokování systémového tlačítka zpět — v iOS je to povoleno, ale uživatel by měl mít jasný způsob zavření prostřednictvím prvku rozhraní.
Často kladené otázky
.fullScreen skrývá nadřazený ovladač a odstraňuje jej z hierarchie zobrazení. .overFullScreen zobrazuje modální ovladač nad nadřazeným, ale nadřazený zůstává v hierarchii a nadále přijímá události. overFullScreen je užitečný pro průhledná pozadí a vlastní animace vrstev.
Apple změnil výchozí styl v iOS 13 pro zlepšení interakce s uživatelem. Page Sheet umožňuje vidět kontext nadřazené obrazovky a zavřít modální okno tahem, což urychluje navigaci. Full Screen Cover zůstává pro scénáře, kde je vyžadováno plné soustředění bez rozptylování pozadím.
V UIKit zavolejte dismiss(animated:completion:) na presentingViewController nebo presentedViewController. V SwiftUI použijte hodnotu prostředí \.dismiss a zavolejte ji jako funkci. Pro programové zavření z nadřazeného ovladače změňte binding předaný do .fullScreenCover na false.
Ano, Full Screen Cover funguje na iPad. Pro iPad jsou k dispozici další styly: .formSheet (centrované okno pevné velikosti) a .currentContext (vzhledem k nadřazenému ovladači). Na iPad může Full Screen Cover vypadat jako Page Sheet, pokud modalPresentationStyle není vynuceně nastaven.
Na rozdíl od Page Sheet se Full Screen Cover nezavírá tahem, takže ztráta dat je možná pouze při programovém dismiss. Přepište metodu dismiss(animated:completion:) nebo použijte UIAdaptivePresentationControllerDelegate, který je volán před zavřením. Zobrazte UIAlertController s možnostmi: uložit, zrušit nebo zůstat na obrazovce.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také