Full Screen Cover: what it is, full-screen presentation and UIKit

Author: IT Sectr Published: 2026-06-09 Reading time: 5 min

Full Screen Cover is a modal presentation style in iOS where the new screen occupies the entire display without visibility of the parent content. Unlike Page Sheet, Full Screen Cover completely hides the previous screen and is used for media content, photo editors, and authorization screens. According to Apple Developer, 2025, this style was the default until iOS 13, but remains preferred for immersive scenarios. In SwiftUI, the .fullScreenCover modifier provides a declarative API for full-screen presentation.

Key Takeaways

  • Full Screen Cover is a full-screen modal presentation in iOS that hides parent content for the entire duration of display.
  • UIModalPresentationStyle.fullScreen is a UIKit constant that sets full-screen mode when calling present.
  • SwiftUI provides the .fullScreenCover modifier for declarative creation of full-screen modal windows.
  • Full Screen Cover differs from Page Sheet by completely covering the background and lacking interactive swipe-to-dismiss.
  • Used for video players, camera, photo editors, PDF viewing, and other immersive scenarios.

What is Full Screen Cover in iOS?

Full Screen Cover is a modal presentation style in iOS where the presented controller occupies the entire device screen. The parent content is completely hidden, creating an immersive effect and focusing the user on the current task.

Before iOS 13, Full Screen Cover was the only modal presentation style on iPhone. All calls to present(_:animated:completion:) used .fullScreen by default. Starting with iOS 13, Apple changed the default style to .automatic, which for iPhone selects .pageSheet. However, Full Screen Cover remains available and is used for scenarios where full focus is important.

Unlike Page Sheet, Full Screen Cover does not allow interaction with parent content and does not show it under the modal window. The user cannot dismiss Full Screen Cover by swiping down — dismissal requires a programmatic call to dismiss(animated:completion:) or a close button on the screen itself. This behavior is important to consider when designing UX.

Full Screen Cover vs Page Sheet: style comparison

Page Sheet is the second main modal presentation style, introduced in iOS 13. Page Sheet displays as a card with a top inset, beneath which the parent screen is visible. The user can dismiss Page Sheet by swiping down. Full Screen Cover, on the contrary, hides the parent content and does not support swipe dismissal.

CharacteristicFull Screen CoverPage Sheet
Background coverageFull, parent content not visiblePartial, parent visible under card
Swipe to dismissNo, only programmatically or via buttonYes, swipe down dismisses
Typical usageVideo, camera, photo editor, PDFForms, settings, detail view
Presentation animationBottom to top, full screenBottom to top, card with inset
AvailabilityiOS 2+iOS 13+

The choice between Full Screen Cover and Page Sheet depends on the content and context. It is recommended to use Full Screen Cover for content that requires full attention: full-screen video, photo preview, document scanning. Page Sheet is for tasks where the parent screen context is important: editing forms, option selection, detail views.

UIKit implementation: UIModalPresentationStyle

UIKit provides the UIModalPresentationStyle.fullScreen constant for setting the modal presentation style. Setting this property on UIViewController before calling present ensures the controller displays in full screen. The controller also manages behavior when the keyboard appears and handles system events.

Configuration and Delegate

After setting the .fullScreen style, it is recommended to configure presentationController?.delegate to handle dismissal events. The UIAdaptivePresentationControllerDelegate delegate allows intercepting dismissal attempts and preventing data loss. Unlike Page Sheet, for Full Screen Cover the delegate only fires on programmatic dismiss calls.

Rotation and Keyboard Handling

Full Screen Cover correctly handles screen rotation and keyboard appearance. When rotated, the modal controller automatically adapts to the new orientation. UIKeyboardWillShowNotification allows shifting content up when the keyboard appears, keeping text fields visible. Unlike Page Sheet, Full Screen Cover does not change its size when the keyboard appears.

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

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

SwiftUI: the .fullScreenCover modifier

SwiftUI provides the .fullScreenCover modifier for declarative creation of full-screen modal windows. Unlike .sheet (Page Sheet), .fullScreenCover creates the .fullScreen style with similar behavior: full content coverage and no swipe dismissal.

Usage with Binding and Data

The modifier accepts a binding to Bool or an optional identifiable item. When the binding is set to true, SwiftUI animates the appearance of the full-screen window. The onDismiss parameter and a content closure are used for data passing. The \.dismiss environment value allows dismissing the modal window from within.

Full Screen Cover vs Sheet

The choice between .fullScreenCover and .sheet in SwiftUI is analogous to UIKit: .fullScreenCover for immersive content, .sheet for cards. SwiftUI automatically selects the correct dismissal behavior: .sheet can be dismissed by swipe, .fullScreenCover only programmatically. Modifiers can be combined in a single View hierarchy.

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)
            }
        }
    }
}

Custom animations and transitions

Full Screen Cover supports custom animations through UIModalTransitionStyle in UIKit and custom transitions in SwiftUI. Standard styles include: .coverVertical (bottom to top), .crossDissolve (fade in), .flipHorizontal (flip), and .partialCurl (page curl effect).

UIKit: UIViewControllerAnimatedTransitioning

For fully custom animation, implement the UIViewControllerAnimatedTransitioning protocol. It allows defining the animation duration and the transition itself via the animateTransition(using:) method. The animation controller is assigned through UINavigationControllerDelegate or UIViewControllerTransitioningDelegate.

SwiftUI: Matched Geometry Effect

In SwiftUI, custom transitions for .fullScreenCover are created using matchedGeometryEffect. This modifier animates the movement of an element from the parent View to the full-screen window. For example, when tapping a photo thumbnail, it smoothly expands to full screen, creating a continuity effect. MatchedGeometryEffect works with id and namespace that link elements in the source and target positions.

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()
        }
    }
}

When to use Full Screen Cover?

Full Screen Cover is recommended for scenarios where content should occupy the entire screen without distraction from the parent interface. Apple HIG identifies three main categories: media content, content creation tools, and temporary system interfaces.

Media and Entertainment

Video players, photo viewing, PDF and comic reading are typical use cases for Full Screen Cover. AVPlayerViewController in iOS automatically uses full-screen mode when transitioning to landscape. Photo editors like Adobe Lightroom open a full-screen editor above the photo library.

Content Creation Tools

Camera, document scanner, voice recording — tasks requiring the user's full attention. UIImagePickerController used Full Screen Cover for the camera before iOS 14. Starting with iOS 14, the system picker uses Page Sheet, but the developer can force .fullScreen for a custom camera.

What to Avoid

Do not use Full Screen Cover for: registration forms (Page Sheet is preferred), screens with text input where parent page context is important, and sequential navigation inside the modal window. Material Design also recommends avoiding blocking the system back button — this is acceptable in iOS, but the user should have a clear way to dismiss via a UI element.

Frequently Asked Questions

What is the difference between .fullScreen and .overFullScreen in iOS?

.fullScreen hides the parent controller and removes it from the display hierarchy. .overFullScreen shows the modal controller above the parent, but the parent remains in the hierarchy and continues to receive events. overFullScreen is useful for transparent backgrounds and custom layer animations.

Why did Apple change the default style from fullScreen to pageSheet?

Apple changed the default style in iOS 13 to improve user interaction. Page Sheet allows seeing the parent screen context and dismissing the modal window by swipe, which speeds up navigation. Full Screen Cover remains for scenarios where full focus without background distraction is required.

How to programmatically dismiss Full Screen Cover?

In UIKit, call dismiss(animated:completion:) on the presentingViewController or presentedViewController. In SwiftUI, use the \.dismiss environment value and call it as a function. For programmatic dismissal from the parent controller, set the binding passed to .fullScreenCover to false.

Does Full Screen Cover work on iPad?

Yes, Full Screen Cover works on iPad. Additional styles are available for iPad: .formSheet (centered fixed-size window) and .currentContext (relative to the parent controller). On iPad, Full Screen Cover may appear as Page Sheet if modalPresentationStyle is not explicitly set.

How to prevent data loss when dismissing Full Screen Cover?

Unlike Page Sheet, Full Screen Cover cannot be dismissed by swipe, so data loss is only possible with programmatic dismiss. Override the dismiss(animated:completion:) method or use UIAdaptivePresentationControllerDelegate, which is called before dismissal. Show a UIAlertController with options: save, cancel, or stay on screen.

Summary

  • Full Screen Cover is an iOS modal presentation style that hides parent content and occupies the entire screen.
  • UIKit implements Full Screen Cover via UIModalPresentationStyle.fullScreen with custom transition animations.
  • SwiftUI provides the .fullScreenCover modifier with support for matchedGeometryEffect for smooth transitions.
  • Full Screen differs from Page Sheet by the absence of swipe-to-dismiss and full coverage of parent content.
  • Recommended for video players, camera, photo editors, and other immersive scenarios.
  • Not recommended for input forms, settings, and navigation sequences inside the modal window.
  • Prevent data loss via UIAdaptivePresentationControllerDelegate with a confirmation dialog on dismiss.

We will develop a mobile application turnkey

IT Sectr creates iOS and Android applications for startups and businesses since 2017. We will advise you and propose the best solution.

Discuss the project

Read also