Full Screen Cover: шта је то, презентација преко целог екрана и UIKit

Аутор: IT Sectr Објављено: 2026-06-09 Време читања: 5 мин

Full Screen Cover — стил модалне презентације у iOS-у, при којем нови екран заузима цео дисплеј без видљивости родитељског садржаја. За разлику од Page Sheet-а, Full Screen Cover у потпуности скрива претходни екран и користи се за медијски садржај, фото едиторе и екране за ауторизацију. Према Apple Developer, 2025, овај стил је био подразумевани до iOS 13, али остаје пожељан за импресивне сценарије. У SwiftUI-ју модификатор .fullScreenCover пружа декларативни API за презентацију преко целог екрана.

Главне тачке

  • Full Screen Cover — модална презентација преко целог екрана iOS-а, која скрива родитељски садржај током целог приказа.
  • UIModalPresentationStyle.fullScreen — константа UIKit-а која поставља режим преко целог екрана при позиву present.
  • SwiftUI пружа модификатор .fullScreenCover за декларативно креирање модалних прозора преко целог екрана.
  • Full Screen Cover се разликује од Page Sheet-а потпуним прекривањем позадине и одсуством интерактивног затварања превлачењем.
  • Користи се за видео плејере, камеру, фото едиторе, преглед PDF-а и друге импресивне сценарије.

Шта је 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(animated: true) {
    print("Плејер одбачен")
}

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

SwiftUI пружа модификатор .fullScreenCover за декларативно креирање модалних прозора преко целог екрана. За разлику од .sheet (Page Sheet), .fullScreenCover креира стил .fullScreen са аналогним понашањем: потпуно прекривање садржаја и одсуство затварања превлачењем.

Коришћење са binding-ом и подацима

Модификатор прихвата binding на Bool или опциони идентификовани објекат. При постављању binding на true, SwiftUI анимира појаву прозора преко целог екрана. За пренос података користи се параметар onDismiss и затварање са садржајем. Вредност окружења \.dismiss омогућава затварање модалног прозора изнутра.

Full Screen Cover vs Sheet

Избор између .fullScreenCover и .sheet у SwiftUI-ју је аналоган UIKit-у: .fullScreenCover за импресиван садржај, .sheet за картице. SwiftUI аутоматски бира исправно понашање затварања: .sheet се може затворити превлачењем, .fullScreenCover — само програмски. Модификатори се могу комбиновати у истој хијерархији View-а.

swift
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 (ефекат странице).

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-ју користите вредност окружења \.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-а одсуством затварања превлачењем и потпуним прекривањем родитељског садржаја.
  • Препоручује се за видео плејере, камеру, фото едиторе и друге импресивне сценарије.
  • Не препоручује се за формуларе, подешавања и навигационе секвенце унутар модалног прозора.
  • Губитак података спречавајте кроз UIAdaptivePresentationControllerDelegate са дијалогом потврде затварања.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође