Full Screen Cover: что это, полноэкранная презентация и UIKit

Автор: IT Sectr Опубликовано: 2026-06-09 Время чтения: 5 мин

Full Screen Cover — стиль модальной презентации в iOS, при котором новый экран занимает весь дисплей без видимости родительского контента. В отличие от Page Sheet, Full Screen Cover полностью скрывает предыдущий экран и используется для медиаконтента, фоторедакторов и экранов авторизации. По данным Apple Developer, 2025, этот стиль был дефолтным до iOS 13, но остаётся предпочтительным для immersive-сценариев. В SwiftUI модификатор .fullScreenCover предоставляет декларативный API для полноэкранной презентации.

Главное

  • Full Screen Cover — полноэкранная модальная презентация iOS, скрывающая родительский контент на всё время показа.
  • UIModalPresentationStyle.fullScreen — константа UIKit, устанавливающая полноэкранный режим при вызове present.
  • SwiftUI предоставляет модификатор .fullScreenCover для декларативного создания полноэкранных модальных окон.
  • Full Screen Cover отличается от Page Sheet полным перекрытием фона и отсутствием интерактивного закрытия свайпом.
  • Используется для видеоплееров, камеры, фоторедакторов, просмотра PDF и других immersive-сценариев.

Что такое Full Screen Cover в iOS?

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.

Full Screen Cover vs Page Sheet: сравнение стилей

Page Sheet — второй основной стиль модальной презентации, появившийся в iOS 13. Page Sheet отображается карточкой с отступом сверху, под которой виден родительский экран. Пользователь может закрыть Page Sheet свайпом вниз. Full Screen Cover, напротив, скрывает родительский контент и не поддерживает свайп-закрытие.

ХарактеристикаFull Screen CoverPage Sheet
Перекрытие фонаПолное, родительский контент не виденЧастичное, родитель виден под карточкой
Закрытие свайпомНет, только программно или через кнопкуДа, свайп вниз закрывает
Типичное применениеВидео, камера, фоторедактор, PDFФормы, настройки, детальный просмотр
Анимация показаСнизу вверх, полный экранСнизу вверх, карточка с отступом
ДоступностьiOS 2+iOS 13+

Выбор между Full Screen Cover и Page Sheet зависит от контента и контекста. Рекомендуется использовать Full Screen Cover для контента, который требует полного внимания: видео в полноэкранном режиме, предпросмотр фотографий, сканирование документов. Page Sheet — для задач, где контекст родительского экрана важен: формы редактирования, выбор опций, просмотр деталей.

Реализация на UIKit: UIModalPresentationStyle

UIKit предоставляет константу UIModalPresentationStyle.fullScreen для настройки стиля модальной презентации. Установка этого свойства на UIViewController перед вызовом present гарантирует, что контроллер отобразится во весь экран. Контроллер также управляет поведением при появлении клавиатуры и обработкой системных событий.

Настройка и делегат

После установки стиля .fullScreen рекомендуется настроить presentationController?.delegate для обработки событий закрытия. Делегат UIAdaptivePresentationControllerDelegate позволяет перехватить попытку закрытия и предотвратить потерю данных. В отличие от Page Sheet, для Full Screen Cover делегат срабатывает только при программном вызове dismiss.

Обработка поворота и клавиатуры

Full Screen Cover корректно обрабатывает поворот экрана и появление клавиатуры. При повороте модальный контроллер автоматически адаптируется под новую ориентацию. UIKeyboardWillShowNotification позволяет сдвинуть контент вверх при появлении клавиатуры, чтобы текстовые поля оставались видимыми. В отличие от Page Sheet, Full Screen Cover не меняет своих размеров при появлении клавиатуры.

swift
let playerVC = VideoPlayerViewController()
playerVC.modalPresentationStyle = .fullScreen
playerVC.modalTransitionStyle = .crossDissolve
present(playerVC, animated: true) {
    playerVC.startPlayback()
}

// Dismiss
dismiss(animated: true) {
    print("Player dismissed")
}

SwiftUI: модификатор .fullScreenCover

SwiftUI предоставляет модификатор .fullScreenCover для декларативного создания полноэкранных модальных окон. В отличие от .sheet (Page Sheet), .fullScreenCover создаёт стиль .fullScreen с аналогичным поведением: полное перекрытие контента и отсутствие свайп-закрытия.

Использование с binding и data

Модификатор принимает binding на Bool или опциональный идентифицируемый объект. При установке binding в true SwiftUI анимирует появление полноэкранного окна. Для передачи данных используется параметр onDismiss и замыкание с контентом. Environment-значение \.dismiss позволяет закрыть модальное окно изнутри.

Full Screen Cover vs Sheet

Выбор между .fullScreenCover и .sheet в SwiftUI аналогичен UIKit: .fullScreenCover для immersive-контента, .sheet для карточек. SwiftUI автоматически выбирает правильное поведение закрытия: .sheet можно закрыть свайпом, .fullScreenCover — только программно. Модификаторы можно комбинировать в одной иерархии View.

swift
struct CameraView: View {
    @State private var showCamera = false

    var body: some View {
        Button("Open Camera") {
            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("Capture") { dismiss() }
                    .foregroundColor(.white)
            }
        }
    }
}

Кастомные анимации и переходы

Full Screen Cover поддерживает кастомные анимации через UIModalTransitionStyle в UIKit и кастомные переходы в SwiftUI. Стандартные стили: .coverVertical (снизу вверх), .crossDissolve (плавное появление), .flipHorizontal (переворот) и .partialCurl (эффект страницы).

UIKit: UIViewControllerAnimatedTransitioning

Для полностью кастомной анимации реализуйте протокол UIViewControllerAnimatedTransitioning. Он позволяет определить длительность анимации и сам переход через метод animateTransition(using:). Контроллер анимации назначается через делегат UINavigationControllerDelegate или UIViewControllerTransitioningDelegate.

SwiftUI: Matched Geometry Effect

В SwiftUI кастомные переходы для .fullScreenCover создаются через matchedGeometryEffect. Этот модификатор анимирует перемещение элемента из родительского View в полноэкранное окно. Например, при нажатии на миниатюру фото она плавно разворачивается на весь экран, создавая эффект непрерывности. MatchedGeometryEffect работает с id и namespace, связывающими элемент в исходной и целевой позиции.

swift
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?

Full Screen Cover рекомендуется для сценариев, где контент должен занимать весь экран без отвлечения на родительский интерфейс. Apple HIG выделяет три основные категории: медиаконтент, инструменты создания контента и временные системные интерфейсы.

Медиа и развлечения

Видеоплееры, просмотр фотографий, чтение PDF и комиксов — типичные примеры использования Full Screen Cover. AVPlayerViewController в iOS автоматически использует полноэкранный режим при переходе в landscape. Фоторедакторы вроде Adobe Lightroom открывают полноэкранный редактор поверх библиотеки снимков.

Инструменты создания контента

Камера, сканер документов, запись голоса — задачи, требующие полного внимания пользователя. UIImagePickerController до iOS 14 использовал Full Screen Cover для камеры. Начиная с iOS 14, системный пикер использует Page Sheet, но разработчик может принудительно установить .fullScreen для кастомной камеры.

Чего избегать

Не используйте Full Screen Cover для: форм регистрации (предпочтителен Page Sheet), экранов с текстовым вводом, где важен контекст родительской страницы, и последовательной навигации внутри модального окна. Material Design также рекомендует избегать блокировки системной кнопки назад — в iOS это допустимо, но пользователь должен иметь явный способ закрытия через UI-элемент.

Часто задаваемые вопросы

В чём разница между .fullScreen и .overFullScreen в iOS?

.fullScreen скрывает родительский контроллер и удаляет его из иерархии отображения. .overFullScreen показывает модальный контроллер поверх родительского, но родитель остаётся в иерархии и продолжает получать события. overFullScreen полезен для прозрачных фонов и кастомных анимаций слоёв.

Почему Apple изменила дефолтный стиль с fullScreen на pageSheet?

Apple изменила дефолтный стиль в iOS 13 для улучшения взаимодействия с пользователем. Page Sheet позволяет видеть контекст родительского экрана и закрывать модальное окно свайпом, что ускоряет навигацию. Full Screen Cover остаётся для сценариев, где требуется полная фокусировка без отвлечения на фон.

Как закрыть Full Screen Cover программно?

В UIKit вызовите dismiss(animated:completion:) на presentingViewController или presentedViewController. В SwiftUI используйте Environment-значение \.dismiss и вызовите его как функцию. Для программного закрытия из родительского контроллера измените binding, переданное в .fullScreenCover, на false.

Работает ли Full Screen Cover на iPad?

Да, Full Screen Cover работает на iPad. Для iPad доступны дополнительные стили: .formSheet (центрированное окно фиксированного размера) и .currentContext (относительно родительского контроллера). На iPad Full Screen Cover может выглядеть как Page Sheet, если не установлен modalPresentationStyle принудительно.

Как предотвратить закрытие Full Screen Cover при потере данных?

В отличие от Page Sheet, Full Screen Cover не закрывается свайпом, поэтому потеря данных возможна только при программном dismiss. Переопределите метод dismiss(animated:completion:) или используйте UIAdaptivePresentationControllerDelegate, который вызывается перед закрытием. Покажите UIAlertController с вариантами: сохранить, отменить или остаться на экране.

Итоги

  • Full Screen Cover — стиль модальной презентации iOS, скрывающий родительский контент и занимающий весь экран.
  • UIKit реализует Full Screen Cover через UIModalPresentationStyle.fullScreen с кастомными анимациями перехода.
  • SwiftUI предоставляет модификатор .fullScreenCover с поддержкой matchedGeometryEffect для плавных переходов.
  • Full Screen отличается от Page Sheet отсутствием свайп-закрытия и полным перекрытием родительского контента.
  • Рекомендуется для видеоплееров, камеры, фоторедакторов и других immersive-сценариев.
  • Не рекомендуется для форм ввода, настроек и навигационных последовательностей внутри модального окна.
  • Потерю данных предотвращайте через UIAdaptivePresentationControllerDelegate с диалогом подтверждения закрытия.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также