Full Screen Cover — styl prezentacji modalnej w iOS, w którym nowy ekran zajmuje cały wyświetlacz bez widoczności nadrzędnego kontentu. W przeciwieństwie do Page Sheet, Full Screen Cover całkowicie ukrywa poprzedni ekran i jest używany do treści medialnych, edytorów zdjęć i ekranów autoryzacji. Według Apple Developer, 2025, ten styl był domyślny do iOS 13, ale pozostaje preferowany w scenariuszach immersyjnych. W SwiftUI modyfikator .fullScreenCover zapewnia deklaratywne API do prezentacji pełnoekranowej.
Najważniejsze
Full Screen Cover — to styl prezentacji modalnej w iOS, w którym prezentowany kontroler zajmuje cały ekran urządzenia. Nadrzędna zawartość jest całkowicie ukryta, co tworzy efekt immersji i skupia użytkownika na bieżącym zadaniu.
Przed iOS 13 Full Screen Cover był jedynym stylem prezentacji modalnej na iPhone. Wszystkie wywołania present(_:animated:completion:) domyślnie używały .fullScreen. Od iOS 13 Apple zmieniło domyślny styl na .automatic, który na iPhone wybiera .pageSheet. Jednak Full Screen Cover pozostaje dostępny i jest używany w scenariuszach wymagających pełnego skupienia.
W przeciwieństwie do Page Sheet, Full Screen Cover nie pozwala na interakcję z nadrzędną zawartością i nie pokazuje jej pod oknem modalnym. Użytkownik nie może zamknąć Full Screen Cover przesunięciem w dół — do zamknięcia wymagane jest programowe wywołanie dismiss(animated:completion:) lub przycisk zamykania na samym ekranie. To zachowanie jest ważne przy projektowaniu UX.
Page Sheet — drugi główny styl prezentacji modalnej, który pojawił się w iOS 13. Page Sheet wyświetla się jako karta z odstępem u góry, pod którą widoczny jest nadrzędny ekran. Użytkownik może zamknąć Page Sheet przesunięciem w dół. Full Screen Cover przeciwnie, ukrywa nadrzędną zawartość i nie obsługuje zamykania przesunięciem.
| Cecha | Full Screen Cover | Page Sheet |
|---|---|---|
| Zakrycie tła | Całkowite, nadrzędna zawartość niewidoczna | częściowe, nadrzędny widoczny pod kartą |
| Zamykanie przesunięciem | Nie, tylko programowo lub przez przycisk | Tak, przesunięcie w dół zamyka |
| Typowe zastosowanie | Wideo, aparat, edytor zdjęć, PDF | Formularze, ustawienia, szczegółowy podgląd |
| Animacja wyświetlania | Z dołu do góry, pełny ekran | Z dołu do góry, karta z odstępem |
| Dostępność | iOS 2+ | iOS 13+ |
Wybór między Full Screen Cover a Page Sheet zależy od treści i kontekstu. Zaleca się używanie Full Screen Cover dla treści wymagających pełnej uwagi: wideo w trybie pełnoekranowym, podgląd zdjęć, skanowanie dokumentów. Page Sheet — do zadań, gdzie kontekst nadrzędnego ekranu jest ważny: formularze edycji, wybór opcji, przeglądanie szczegółów.
UIKit zapewnia stałą UIModalPresentationStyle.fullScreen do konfiguracji stylu prezentacji modalnej. Ustawienie tej właściwości na UIViewController przed wywołaniem present gwarantuje, że kontroler wyświetli się na pełnym ekranie. Kontroler zarządza również zachowaniem przy pojawieniu się klawiatury i obsługą zdarzeń systemowych.
Po ustawieniu stylu .fullScreen zaleca się skonfigurowanie presentationController?.delegate do obsługi zdarzeń zamknięcia. Delegat UIAdaptivePresentationControllerDelegate pozwala przechwycić próbę zamknięcia i zapobiec utracie danych. W przeciwieństwie do Page Sheet, dla Full Screen Cover delegat działa tylko przy programowym wywołaniu dismiss.
Full Screen Cover poprawnie obsługuje obrót ekranu i pojawienie się klawiatury. Przy obrocie kontroler modalny automatycznie dostosowuje się do nowej orientacji. UIKeyboardWillShowNotification pozwala przesunąć zawartość w górę przy pojawieniu się klawiatury, aby pola tekstowe pozostały widoczne. W przeciwieństwie do Page Sheet, Full Screen Cover nie zmienia swoich rozmiarów przy pojawieniu się klawiatury.
let playerVC = VideoPlayerViewController()
playerVC.modalPresentationStyle = .fullScreen
playerVC.modalTransitionStyle = .crossDissolve
present(playerVC, animated: true) {
playerVC.startPlayback()
}
// Zamknij
dismiss(animated: true) {
print("Odtwarzacz zamknięty")
}
SwiftUI zapewnia modyfikator .fullScreenCover do deklaratywnego tworzenia pełnoekranowych okien modalnych. W przeciwieństwie do .sheet (Page Sheet), .fullScreenCover tworzy styl .fullScreen z analogicznym zachowaniem: całkowite zakrycie zawartości i brak zamykania przesunięciem.
Modyfikator przyjmuje binding na Bool lub opcjonalny identyfikowalny obiekt. Przy ustawieniu binding na true SwiftUI animuje pojawienie się pełnoekranowego okna. Do przekazywania danych używany jest parametr onDismiss i domknięcie z zawartością. Wartość środowiska \.dismiss pozwala zamknąć okno modalne od wewnątrz.
Wybór między .fullScreenCover a .sheet w SwiftUI jest analogiczny do UIKit: .fullScreenCover dla immersyjnych treści, .sheet dla kart. SwiftUI automatycznie wybiera prawidłowe zachowanie zamykania: .sheet można zamknąć przesunięciem, .fullScreenCover — tylko programowo. Modyfikatory można łączyć w jednej hierarchii View.
struct CameraView: View {
@State private var showCamera = false
var body: some View {
Button("Otwórz kamerę") {
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("Zrób zdjęcie") { dismiss() }
.foregroundColor(.white)
}
}
}
}
Full Screen Cover obsługuje niestandardowe animacje przez UIModalTransitionStyle w UIKit i niestandardowe przejścia w SwiftUI. Standardowe style: .coverVertical (z dołu do góry), .crossDissolve (płynne pojawienie się), .flipHorizontal (obrót) i .partialCurl (efekt strony).
Dla w pełni niestandardowej animacji zaimplementuj protokół UIViewControllerAnimatedTransitioning. Pozwala on określić czas trwania animacji i samo przejście przez metodę animateTransition(using:). Kontroler animacji jest przypisywany przez delegata UINavigationControllerDelegate lub UIViewControllerTransitioningDelegate.
W SwiftUI niestandardowe przejścia dla .fullScreenCover tworzone są przez matchedGeometryEffect. Ten modyfikator animuje przeniesienie elementu z nadrzędnego View do pełnoekranowego okna. Na przykład, po kliknięciu miniatury zdjęcia płynnie rozwija się ono na cały ekran, tworząc efekt ciągłości. MatchedGeometryEffect działa z id i namespace, łączącymi element w pozycji źródłowej i docelowej.
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 jest zalecany w scenariuszach, gdzie treść powinna zajmować cały ekran bez rozpraszania uwagi na nadrzędny interfejs. Apple HIG wyróżnia trzy główne kategorie: treści medialne, narzędzia do tworzenia treści i tymczasowe interfejsy systemowe.
Odtwarzacze wideo, przeglądanie zdjęć, czytanie PDF i komiksów — typowe przykłady użycia Full Screen Cover. AVPlayerViewController w iOS automatycznie używa trybu pełnoekranowego przy przejściu w landscape. Edytory zdjęć takie jak Adobe Lightroom otwierają pełnoekranowy edytor nad biblioteką zdjęć.
Aparat, skaner dokumentów, nagrywanie głosu — zadania wymagające pełnej uwagi użytkownika. UIImagePickerController do iOS 14 używał Full Screen Cover dla aparatu. Od iOS 14 systemowy picker używa Page Sheet, ale programista może wymusić .fullScreen dla niestandardowego aparatu.
Nie używaj Full Screen Cover do: formularzy rejestracji (preferowany Page Sheet), ekranów z wprowadzaniem tekstu, gdzie ważny jest kontekst nadrzędnej strony, oraz nawigacji sekwencyjnej wewnątrz okna modalnego. Material Design również zaleca unikanie blokowania systemowego przycisku wstecz — w iOS jest to dopuszczalne, ale użytkownik powinien mieć wyraźny sposób zamknięcia przez element interfejsu.
Często zadawane pytania
.fullScreen ukrywa nadrzędny kontroler i usuwa go z hierarchii wyświetlania. .overFullScreen pokazuje kontroler modalny nad nadrzędnym, ale nadrzędny pozostaje w hierarchii i nadal otrzymuje zdarzenia. overFullScreen jest przydatny dla przezroczystych teł i niestandardowych animacji warstw.
Apple zmieniło domyślny styl w iOS 13 dla poprawy interakcji z użytkownikiem. Page Sheet pozwala widzieć kontekst nadrzędnego ekranu i zamykać okno modalne przesunięciem, co przyspiesza nawigację. Full Screen Cover pozostaje w scenariuszach wymagających pełnego skupienia bez rozpraszania tłem.
W UIKit wywołaj dismiss(animated:completion:) na presentingViewController lub presentedViewController. W SwiftUI użyj wartości środowiska \.dismiss i wywołaj ją jako funkcję. Do programowego zamknięcia z nadrzędnego kontrolera zmień binding przekazane do .fullScreenCover na false.
Tak, Full Screen Cover działa na iPad. Dla iPada dostępne są dodatkowe style: .formSheet (wyśrodkowane okno o stałym rozmiarze) i .currentContext (względem nadrzędnego kontrolera). Na iPad Full Screen Cover może wyglądać jak Page Sheet, jeśli modalPresentationStyle nie jest ustawiony强制.
W przeciwieństwie do Page Sheet, Full Screen Cover nie zamyka się przesunięciem, więc utrata danych jest możliwa tylko przy programowym dismiss. Nadpisz metodę dismiss(animated:completion:) lub użyj UIAdaptivePresentationControllerDelegate, który jest wywoływany przed zamknięciem. Pokaż UIAlertController z opcjami: zapisz, anuluj lub pozostań na ekranie.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również