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 و closure محتوا استفاده میشود. مقدار محیطی \.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 تا iOS 14 از Full Screen Cover برای دوربین استفاده میکرد. از 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 از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید