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، الذي يختار .pageSheet لـ iPhone. ولكن Full Screen Cover يظل متاحًا ويستخدم في السيناريوهات حيث يهم التركيز الكامل.
بالخلاف من Page Sheet، لا يسمح Full Screen Cover بالتفاعل مع المحتوى الأصلي ولا يعرضه تحت النافذة المشرفية. لا يمكن للمستخدم إغلاق Full Screen Cover بالتمرير لأسفل — يتطلب الإغلاق استدعاء برمجيًا لـ dismiss(animated:completion:) أو زر إغلاق على الشاشة نفسها. من المهم مراعاة هذا السلوك عند تصميم تجربة المستخدم.
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 وإغلاق بمحتوى. تسمح قيمة البيئة \.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 كان يستخدم Full Screen Cover للكاميرا قبل iOS 14. بدءًا من 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(animated:completion:) أو استخدم UIAdaptivePresentationControllerDelegate الذي يتم استدعاؤه قبل الإغلاق. اعرض UIAlertController بخيارات: حفظ، إلغاء أو البقاء على الشاشة.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.