كيف تغير لون نص Status Bar في iOS: 5 أخطاء قاتلة وكيف تتجنبها
\n\nكل مطور iOS واجه هذا الموقف مرة على الأقل: تكتب تطبيقًا، تختار خلفية داكنة مثالية للشاشة، لكن Status Bar (شريط الحالة) لا يزال يعرض نصًا أسود. يبدو هذا غير احترافي على الأقل، والمستخدمون يكتبون في التعليقات: "لا أرى شيئًا". هل تشعر بهذا الألم المألوف؟
\n\nسؤال "How to change Status Bar text color in iOS" هو واحد من أكثر الأسئلة شيوعًا على Stack Overflow مع عشرات الآلاف من المشاهدات. المشكلة أن المبتدئين (وليس فقط) يكررون نفس الأخطاء مرارًا وتكرارًا. في هذا المقال، سنحلل 5 أخطاء قاتلة تدمر شريط الحالة الخاص بك، ونوضح كيفية إصلاحها باستخدام Swift. هيا بنا!
\n\nلماذا يعتبر Status Bar صداعًا؟
\n\niOS نظام صارم. لا يسمح لك ببساطة بتلوين Status Bar كما تشاء. كل شيء يتحكم فيه UIStatusBarStyle، وإذا كنت لا تعرف الآلية الدقيقة، يتحول الكود إلى تخمين. دعنا نفهم الأمر بشكل منهجي.
الخطأ رقم 1: نسيان ملف Info.plist
\n\nالخطأ الأكثر شيوعًا هو محاولة تغيير نمط Status Bar دون السماح بذلك في إعدادات المشروع. افتراضيًا، تدير iOS شريط الحالة بنفسها، ويتم تجاهل الكود الخاص بك.
\n\n// ❌ خطأ: يوجد كود ولكن لا يوجد إذن\noverride var preferredStatusBarStyle: UIStatusBarStyle {\n return .lightContent\n}\n\nالحل: أضف المفتاح UIViewControllerBasedStatusBarAppearance إلى ملف Info.plist واجعله YES. بدون هذا، لن يكون لـ View Controller الخاص بك رأي.
<key>UIViewControllerBasedStatusBarAppearance</key>\n<true/>\n\nالآن، سيسأل iOS كل وحدة تحكم: "ما نمط Status Bar الذي تريده؟" وسيعمل الكود الخاص بك.
\n\nالخطأ رقم 2: وضع الكود في المكان الخطأ
\n\nيكتب العديد من المبتدئين preferredStatusBarStyle داخل دالة viewDidLoad() أو viewWillAppear(). ثم يتفاجؤون بعدم حدوث أي تغيير.
// ❌ خطأ: هذه خاصية وليست دالة\noverride func viewDidLoad() {\n super.viewDidLoad()\n preferredStatusBarStyle = .lightContent // لن يعمل!\n}\n\nالطريقة الصحيحة: preferredStatusBarStyle هي خاصية محسوبة (computed property) يطلبها iOS في كل مرة يحتاج فيها لتحديث Status Bar. يجب تعريفها على مستوى الفئة، وليس داخل دالة.
// ✅ صحيح\noverride var preferredStatusBarStyle: UIStatusBarStyle {\n return .lightContent\n}\n\nإذا كنت بحاجة لتغيير النمط ديناميكيًا (مثل تغيير السمة)، استخدم setNeedsStatusBarAppearanceUpdate():
var isDarkMode = false {\n didSet {\n setNeedsStatusBarAppearanceUpdate()\n }\n}\n\noverride var preferredStatusBarStyle: UIStatusBarStyle {\n return isDarkMode ? .lightContent : .default\n}\n\nالخطأ رقم 3: تجاهل Navigation Controller
\n\nإذا كان تطبيقك يستخدم UINavigationController، فقد لا يعمل preferredStatusBarStyle الخاص بوحدة التحكم الفرعية. لماذا؟ لأن Navigation Controller يدير Status Bar بنفسه.
الحل رقم 1 (بسيط): تجاوز الخاصية في Navigation Controller.
\n\nclass CustomNavigationController: UINavigationController {\n override var preferredStatusBarStyle: UIStatusBarStyle {\n return topViewController?.preferredStatusBarStyle ?? .default\n }\n}\n\nالحل رقم 2 (نظيف): استخدم childForStatusBarStyle. هذه طريقة أكثر مرونة تفوض التحكم إلى وحدة التحكم الفرعية.
class CustomNavigationController: UINavigationController {\n override var childForStatusBarStyle: UIViewController? {\n return topViewController\n }\n}\n\nالخطأ رقم 4: عدم تحديث Status Bar بعد تغيير الخلفية
\n\nيغير بعض المطورين لون الخلفية في viewWillAppear لكنهم ينسون تحديث Status Bar. النتيجة: خلفية داكنة مع نص داكن، أو العكس.
// ❌ خطأ: تغيير الخلفية دون تحديث Status Bar\noverride func viewWillAppear(_ animated: Bool) {\n super.viewWillAppear(animated)\n view.backgroundColor = .black // الخلفية أصبحت داكنة\n // لكن Status Bar لا يزال فاتحًا!\n}\n\nالحل: استدعِ setNeedsStatusBarAppearanceUpdate() بعد تغيير الخلفية.
override func viewWillAppear(_ animated: Bool) {\n super.viewWillAppear(animated)\n view.backgroundColor = .black\n setNeedsStatusBarAppearanceUpdate()\n}\n\noverride var preferredStatusBarStyle: UIStatusBarStyle {\n return .lightContent // نص أبيض على خلفية داكنة\n}\n\nالخطأ رقم 5: استخدام الطرق القديمة (iOS 13+)
\n\nقبل iOS 13، كان بإمكانك استخدام UIApplication.shared.statusBarStyle. لكن هذه الطريقة أصبحت مهملة (deprecated) منذ iOS 13. إذا كنت لا تزال تستخدمها، فسيتم تجاهلها في الإصدارات الحديثة.
// ❌ خطأ: طريقة قديمة ومهملة\nUIApplication.shared.statusBarStyle = .lightContent\n\nالحل: استخدم الطريقة الحديثة عبر preferredStatusBarStyle كما شرحنا أعلاه. إذا كنت تدعم iOS 12 والإصدارات الأقدم، يمكنك استخدام التحقق من الإصدار:
if #available(iOS 13, *) {\n // استخدم الطريقة الجديدة\n setNeedsStatusBarAppearanceUpdate()\n} else {\n // استخدم الطريقة القديمة للإصدارات الأقدم\n UIApplication.shared.statusBarStyle = .lightContent\n}\n\nالخلاصة: قائمة تحقق سريعة
\n\n- \n
- تأكد من إضافة
UIViewControllerBasedStatusBarAppearance = YESفي Info.plist. \n - استخدم
preferredStatusBarStyleكخاصية محسوبة على مستوى الفئة. \n - تعامل مع Navigation Controller بشكل صحيح باستخدام
childForStatusBarStyle. \n - استدعِ
setNeedsStatusBarAppearanceUpdate()عند تغيير الخلفية أو السمة. \n - تجنب الطرق القديمة والمهملة في iOS 13+. \n
الآن أنت جاهز لجعل Status Bar في تطبيقك يبدو احترافيًا في أي ظرف. جرب هذه الحلول في مشروعك القادم، ولن تواجه مشاكل مع لون النص بعد الآن!