Full Screen Cover — gaya presentasi modal di iOS di mana layar baru menempati seluruh layar tanpa terlihatnya konten induk. Berbeda dengan Page Sheet, Full Screen Cover sepenuhnya menyembunyikan layar sebelumnya dan digunakan untuk konten media, editor foto, dan layar otorisasi. Menurut Apple Developer, 2025, gaya ini adalah default hingga iOS 13, tetapi tetap menjadi pilihan utama untuk skenario imersif. Di SwiftUI, pengubah .fullScreenCover menyediakan API deklaratif untuk presentasi layar penuh.
Poin utama
Full Screen Cover — adalah gaya presentasi modal di iOS di mana pengontrol yang disajikan menempati seluruh layar perangkat. Konten induk sepenuhnya disembunyikan, menciptakan efek imersif dan memfokuskan pengguna pada tugas saat ini.
Sebelum iOS 13, Full Screen Cover adalah satu-satunya gaya presentasi modal di iPhone. Semua panggilan present(_:animated:completion:) secara default menggunakan .fullScreen. Mulai iOS 13, Apple mengubah gaya default menjadi .automatic, yang untuk iPhone memilih .pageSheet. Namun, Full Screen Cover tetap tersedia dan digunakan untuk skenario di mana fokus penuh penting.
Berbeda dengan Page Sheet, Full Screen Cover tidak memungkinkan interaksi dengan konten induk dan tidak menampilkannya di bawah jendela modal. Pengguna tidak dapat menutup Full Screen Cover dengan menggesek ke bawah — untuk menutup diperlukan panggilan programatik dismiss(animated:completion:) atau tombol tutup di layar itu sendiri. Perilaku ini penting untuk dipertimbangkan saat mendesain UX.
Page Sheet — gaya utama kedua dari presentasi modal, muncul di iOS 13. Page Sheet ditampilkan sebagai kartu dengan jarak dari atas, di mana layar induk terlihat di bawahnya. Pengguna dapat menutup Page Sheet dengan menggesek ke bawah. Full Screen Cover, sebaliknya, menyembunyikan konten induk dan tidak mendukung penutupan dengan gesekan.
| Karakteristik | Full Screen Cover | Page Sheet |
|---|---|---|
| Penutupan latar | Penuh, konten induk tidak terlihat | Sebagian, induk terlihat di bawah kartu |
| Penutupan dengan gesekan | Tidak, hanya programatik atau tombol | Ya, gesek ke bawah menutup |
| Penggunaan tipikal | Video, kamera, editor foto, PDF | Formulir, pengaturan, tampilan detail |
| Animasi tampilan | Dari bawah ke atas, layar penuh | Dari bawah ke atas, kartu dengan jarak |
| Ketersediaan | iOS 2+ | iOS 13+ |
Pilihan antara Full Screen Cover dan Page Sheet tergantung pada konten dan konteks. Disarankan menggunakan Full Screen Cover untuk konten yang memerlukan perhatian penuh: video dalam mode layar penuh, pratinjau foto, pemindaian dokumen. Page Sheet — untuk tugas di mana konteks layar induk penting: formulir pengeditan, pemilihan opsi, tampilan detail.
UIKit menyediakan konstanta UIModalPresentationStyle.fullScreen untuk mengonfigurasi gaya presentasi modal. Mengatur properti ini pada UIViewController sebelum panggilan present memastikan pengontrol ditampilkan di layar penuh. Pengontrol juga mengelola perilaku saat keyboard muncul dan pemrosesan peristiwa sistem.
Setelah mengatur gaya .fullScreen, disarankan untuk mengonfigurasi presentationController?.delegate untuk menangani peristiwa penutupan. Delegasi UIAdaptivePresentationControllerDelegate memungkinkan mencegat upaya penutupan dan mencegah kehilangan data. Berbeda dengan Page Sheet, untuk Full Screen Cover delegasi hanya aktif saat panggilan dismiss programatik.
Full Screen Cover menangani rotasi layar dan kemunculan keyboard dengan benar. Saat rotasi, pengontrol modal secara otomatis menyesuaikan dengan orientasi baru. UIKeyboardWillShowNotification memungkinkan menggeser konten ke atas saat keyboard muncul, sehingga bidang teks tetap terlihat. Berbeda dengan Page Sheet, Full Screen Cover tidak mengubah ukurannya saat keyboard muncul.
let playerVC = VideoPlayerViewController()
playerVC.modalPresentationStyle = .fullScreen
playerVC.modalTransitionStyle = .crossDissolve
present(playerVC, animated: true) {
playerVC.startPlayback()
}
// Tutup
dismiss(animated: true) {
print("Pemutar ditutup")
}
SwiftUI menyediakan pengubah .fullScreenCover untuk pembuatan deklaratif jendela modal layar penuh. Berbeda dengan .sheet (Page Sheet), .fullScreenCover membuat gaya .fullScreen dengan perilaku analog: penutupan konten sepenuhnya dan tidak ada penutupan dengan gesekan.
Pengubah menerima binding pada Bool atau objek yang dapat diidentifikasi opsional. Saat binding diatur ke true, SwiftUI menganimasikan kemunculan jendela layar penuh. Untuk transfer data, parameter onDismiss dan closure dengan konten digunakan. Nilai lingkungan \.dismiss memungkinkan menutup jendela modal dari dalam.
Pilihan antara .fullScreenCover dan .sheet di SwiftUI analog dengan UIKit: .fullScreenCover untuk konten imersif, .sheet untuk kartu. SwiftUI secara otomatis memilih perilaku penutupan yang benar: .sheet dapat ditutup dengan gesekan, .fullScreenCover — hanya secara programatik. Pengubah dapat digabungkan dalam hierarki View yang sama.
struct CameraView: View {
@State private var showCamera = false
var body: some View {
Button("Buka kamera") {
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("Ambil gambar") { dismiss() }
.foregroundColor(.white)
}
}
}
}
Full Screen Cover mendukung animasi kustom melalui UIModalTransitionStyle di UIKit dan transisi kustom di SwiftUI. Gaya standar: .coverVertical (dari bawah ke atas), .crossDissolve (kemunculan bertahap), .flipHorizontal (membalik) dan .partialCurl (efek halaman).
Untuk animasi yang sepenuhnya kustom, implementasikan protokol UIViewControllerAnimatedTransitioning. Ini memungkinkan Anda menentukan durasi animasi dan transisi itu sendiri melalui metode animateTransition(using:). Pengontrol animasi ditetapkan melalui delegasi UINavigationControllerDelegate atau UIViewControllerTransitioningDelegate.
Di SwiftUI, transisi kustom untuk .fullScreenCover dibuat melalui matchedGeometryEffect. Pengubah ini menganimasikan perpindahan elemen dari View induk ke jendela layar penuh. Misalnya, saat mengklik miniatur foto, foto tersebut meluas secara mulus ke layar penuh, menciptakan efek kontinuitas. MatchedGeometryEffect bekerja dengan id dan namespace, menghubungkan elemen di posisi sumber dan target.
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 disarankan untuk skenario di mana konten harus menempati seluruh layar tanpa gangguan dari antarmuka induk. Apple HIG membedakan tiga kategori utama: konten media, alat pembuatan konten, dan antarmuka sistem sementara.
Pemutar video, tampilan foto, membaca PDF dan komik — contoh tipikal penggunaan Full Screen Cover. AVPlayerViewController di iOS secara otomatis menggunakan mode layar penuh saat beralih ke lanskap. Editor foto seperti Adobe Lightroom membuka editor layar penuh di atas pustaka gambar.
Kamera, pemindai dokumen, perekaman suara — tugas yang memerlukan perhatian penuh pengguna. UIImagePickerController hingga iOS 14 menggunakan Full Screen Cover untuk kamera. Mulai iOS 14, pemilih sistem menggunakan Page Sheet, tetapi pengembang dapat memaksa .fullScreen untuk kamera kustom.
Jangan gunakan Full Screen Cover untuk: formulir pendaftaran (Page Sheet lebih disukai), layar dengan input teks di mana konteks halaman induk penting, dan navigasi berurutan di dalam jendela modal. Material Design juga merekomendasikan untuk menghindari pemblokiran tombol kembali sistem — di iOS ini diizinkan, tetapi pengguna harus memiliki cara penutupan yang jelas melalui elemen UI.
Pertanyaan yang sering diajukan
.fullScreen menyembunyikan pengontrol induk dan menghapusnya dari hierarki tampilan. .overFullScreen menampilkan pengontrol modal di atas pengontrol induk, tetapi induk tetap dalam hierarki dan terus menerima peristiwa. overFullScreen berguna untuk latar belakang transparan dan animasi lapisan kustom.
Apple mengubah gaya default di iOS 13 untuk meningkatkan interaksi pengguna. Page Sheet memungkinkan melihat konteks layar induk dan menutup jendela modal dengan gesekan, yang mempercepat navigasi. Full Screen Cover tetap untuk skenario di mana fokus penuh tanpa gangguan latar belakang diperlukan.
Di UIKit, panggil dismiss(animated:completion:) pada presentingViewController atau presentedViewController. Di SwiftUI, gunakan nilai lingkungan \.dismiss dan panggil sebagai fungsi. Untuk penutupan programatik dari pengontrol induk, ubah binding yang diteruskan ke .fullScreenCover menjadi false.
Ya, Full Screen Cover berfungsi di iPad. Untuk iPad tersedia gaya tambahan: .formSheet (jendela terpusat dengan ukuran tetap) dan .currentContext (relatif terhadap pengontrol induk). Di iPad, Full Screen Cover mungkin terlihat seperti Page Sheet jika modalPresentationStyle tidak diatur secara paksa.
Berbeda dengan Page Sheet, Full Screen Cover tidak ditutup dengan gesekan, jadi kehilangan data hanya mungkin terjadi saat dismiss programatik. Timpa metode dismiss(animated:completion:) atau gunakan UIAdaptivePresentationControllerDelegate yang dipanggil sebelum penutupan. Tampilkan UIAlertController dengan opsi: simpan, batalkan, atau tetap di layar.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga