Full Screen Cover — це стиль модальної презентації в iOS, при якому новий екран займає весь дисплей без видимості батьківського контенту. На відміну від Page Sheet, Full Screen Cover повністю ховає попередній екран і використовується для медіаконтенту, фоторедакторів та екранів авторизації. За даними Apple Developer, 2025, цей стиль був типовим до iOS 13, але залишається предпочитливим для імерсивних сценаріїв. У SwiftUI модифікатор .fullScreenCover надає декларативний API для повноекранної презентації.
Головне
Full Screen Cover — це стиль модальної презентації в iOS, при якому представлений контролер займає весь екран пристрою. Батьківський контент повністю ховається, створюючи імерсивний ефект та зосереджуючи користувача на поточному завданні.
До iOS 13 Full Screen Cover був єдиним стилем модальної презентації на iPhone. Всі виклики present(_:animated:completion:) типово використовували .fullScreen. Починаючи з iOS 13, Apple змінила типовий стиль на .automatic, який для iPhone обирає .pageSheet. Однак Full Screen Cover залишається доступним і застосовується для сценаріїв, де важлива повна зосередженість.
На відміну від Page Sheet, Full Screen Cover не дозволяє взаємодіяти з батьківським контентом і не показує його під модальним вікном. Користувач не може закрити Full Screen Cover свайпом вниз — для закриття потрібен програмний виклик dismiss(animated:completion:) або кнопка закриття на самому екрані. Цю поведінку важливо враховувати при проектуванні UX.
Page Sheet — другий основний стиль модальної презентації, що з'явився в iOS 13. Page Sheet відображається як картка з відступом зверху, під якою видно батьківський екран. Користувач може закрити Page Sheet свайпом вниз. Full Screen Cover, навпаки, ховає батьківський контент і не підтримує закриття свайпом.
| Характеристика | Full Screen Cover | Page Sheet |
|---|---|---|
| Перекриття фону | Повне, батьківський контент не видно | Часткове, батьківський видно під карткою |
| Закриття свайпом | Ні, тільки програмно або через кнопку | Так, свайп вниз закриває |
| Типове застосування | Відео, камера, фоторедактор, PDF | Форми, налаштування, детальний перегляд |
| Анімація показу | Знизу вгору, повний екран | Знизу вгору, картка з відступом |
| Доступність | iOS 2+ | iOS 13+ |
Вибір між Full Screen Cover та Page Sheet залежить від контенту та контексту. Рекомендується використовувати Full Screen Cover для контенту, що потребує повної уваги: відео на повний екран, попередній перегляд фото, сканування документів. Page Sheet для завдань, де контекст батьківського екрану важливий: форми редагування, вибір опцій, перегляд деталей.
UIKit надає константу UIModalPresentationStyle.fullScreen для налаштування стилю модальної презентації. Встановлення цієї властивості на UIViewController перед викликом present гарантує, що контролер відобразиться на весь екран. Контролер також керує поведінкою при появі клавіатури та обробляє системні події.
Після встановлення стилю .fullScreen рекомендується налаштувати presentationController?.delegate для обробки подій закриття. Делегат UIAdaptivePresentationControllerDelegate дозволяє перехопити спроби закриття та запобігти втраті даних. На відміну від Page Sheet, для Full Screen Cover делегат спрацює тільки при програмному виклику dismiss.
Full Screen Cover коректно обробляє поворот екрану та появу клавіатури. При повороті модальний контролер автоматично адаптується до нової орієнтації. UIKeyboardWillShowNotification дозволяє зсунути контент вгору при появі клавіатури, щоб текстові поля залишалися видимими. На відміну від Page Sheet, Full Screen Cover не змінює свій розмір при появі клавіатури.
let playerVC = VideoPlayerViewController()
playerVC.modalPresentationStyle = .fullScreen
playerVC.modalTransitionStyle = .crossDissolve
present(playerVC, animated: true) {
playerVC.startPlayback()
}
// Закрити
dismiss(animated: true) {
print("Плеер закрито")
}
SwiftUI надає модифікатор .fullScreenCover для декларативного створення повноекранних модальних вікон. На відміну від .sheet (Page Sheet), .fullScreenCover створює стиль .fullScreen з аналогічною поведінкою: повне перекриття контенту та відсутність закриття свайпом.
Модифікатор приймає binding на Bool або опційний ідентифікований об'єкт. Коли binding встановлюється в true, SwiftUI анімує появу повноекранного вікна. Для передачі даних використовується параметр onDismiss та замикання з контентом. Значення середовища \.dismiss дозволяє закрити модальне вікно зсередини.
Вибір між .fullScreenCover та .sheet в SwiftUI аналогічний до UIKit: .fullScreenCover для імерсивного контенту, .sheet для карток. SwiftUI автоматично обирає правильну поведінку закриття: .sheet можна закрити свайпом, .fullScreenCover — тільки програмно. Модифікатори можна комбінувати в одній ієрархії View.
struct CameraView: View {
@State private var showCamera = false
var body: some View {
Button("Відкрити камеру") {
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("Захопити") { dismiss() }
.foregroundColor(.white)
}
}
}
}
Full Screen Cover підтримує кастомні анімації через UIModalTransitionStyle в UIKit та кастомні переходи в SwiftUI. Стандартні стилі: .coverVertical (знизу вгору), .crossDissolve (плавна поява), .flipHorizontal (переворот) та .partialCurl (ефект сторінки).
Для повністю кастомної анімації реалізуйте протокол UIViewControllerAnimatedTransitioning. Він дозволяє визначити тривалість анімації та сам перехід через метод animateTransition(using:). Контролер анімації призначається через UINavigationControllerDelegate або UIViewControllerTransitioningDelegate.
У SwiftUI кастомні переходи для .fullScreenCover створюються через matchedGeometryEffect. Цей модифікатор анімує переміщення елемента з батьківського View у повноекранне вікно. Наприклад, при натисканні на мініатюру фото вона плавно розгортається на весь екран, створюючи ефект безперервності. MatchedGeometryEffect працює з id та namespace, які пов'язують елемент у вихідній та цільовій позиціях.
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 рекомендується для сценаріїв, де контент повинен займати весь екран без відволікання на батьківський інтерфейс. Apple HIG виділяє три основні категорії: медіаконтент, інструменти створення контенту та тимчасові системні інтерфейси.
Відеоплеери, перегляд фото, читання PDF та коміксів — типові приклади використання Full Screen Cover. AVPlayerViewController в iOS автоматично використовує повноекранний режим при переході в ландшафт. Фоторедактори типу Adobe Lightroom відкривають повноекранний редактор поверх бібліотеки знімків.
Камера, сканер документів, запис голосу — завдання, що потребують повної уваги користувача. UIImagePickerController використовував Full Screen Cover для камери до iOS 14. Починаючи з iOS 14, системний пікер використовує Page Sheet, але розробник може примусово встановити .fullScreen для кастомної камери.
Не використовуйте Full Screen Cover для: форм реєстрації (надавайте перевагу Page Sheet), екранів з текстовим введенням, де контекст батьківської сторінки важливий, та послідовної навігації всередині модального вікна. Material Design також рекомендує уникати блокування системної кнопки назад — це допустимо в iOS, але користувач повинен мати чіткий спосіб закриття через елемент інтерфейсу.
Часті запитання
.fullScreen ховає батьківський контролер та видаляє його з ієрархії відображення. .overFullScreen показує модальний контролер поверх батьківського, але батьківський залишається в ієрархії та продовжує отримувати події. overFullScreen корисний для прозорих фонів та кастомних анімацій шарів.
Apple змінила типовий стиль в iOS 13 для покращення взаємодії з користувачем. Page Sheet дозволяє бачити контекст батьківського екрану та закривати модальне вікно свайпом, що прискорює навігацію. Full Screen Cover залишається для сценаріїв, де потрібна повна зосередженість без відволікання на фон.
У UIKit викличіть dismiss(animated:completion:) на presentingViewController або presentedViewController. У SwiftUI використовуйте значення середовища \.dismiss та викличіть його як функцію. Для програмного закриття з батьківського контролера встановіть binding, передане в .fullScreenCover, на false.
Так, Full Screen Cover працює на iPad. Для iPad доступні додаткові стилі: .formSheet (центроване вікно фіксованого розміру) та .currentContext (відносно батьківського контролера). На iPad Full Screen Cover може виглядати як Page Sheet, якщо modalPresentationStyle не встановлено примусово.
На відміну від Page Sheet, Full Screen Cover не закривається свайпом, тому втрата даних можлива лише при програмному dismiss. Перевизначте метод dismiss(animated:completion:) або використовуйте UIAdaptivePresentationControllerDelegate, який викликається перед закриттям. Покажіть UIAlertController з варіантами: зберегти, скасувати або залишитися на екрані.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також