إمكانية الوصول في Swift: جعل تطبيقات iOS متاحة للجميع

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا إمكانية الوصول ليست مجرد علامة، بل قوة خارقة لتطبيقك

\n\n

تخيل: لقد أنشأت تطبيقًا رائعًا. واجهة جميلة، رسوم متحركة سريعة، كود مثالي بلغة Swift. أنت فخور به. ولكن فجأة يتبين أن 15% من المستخدمين لا يستطيعون استخدامه. بالنسبة لهم، الأزرار صغيرة جدًا، النص يندمج مع الخلفية، و VoiceOver "يقرأ" فوضى بدلاً من القائمة. هل هذا مألوف؟

\n\n

إمكانية الوصول (Accessibility) ليست عن "الإلزام" ولا عن "لأجل العلامة فقط". إنها عن الشمولية، عن الاهتمام، والأهم من ذلك، عن الأعمال. في iOS يوجد إطار عمل قوي جدًا يسمح بتكييف التطبيق مع احتياجات الأشخاص ذوي الإعاقات البصرية والسمعية والحركية والإدراكية. و Swift يمنحنا جميع الأدوات للقيام بذلك بأناقة.

\n\n

في هذه المقالة، لن نلقي محاضرات مملة. سنستعرض أمثلة كود محددة يمكنك تطبيقها فورًا في مشروعك. هيا بنا!

\n\n

VoiceOver: كيف "تعلم" التطبيق أن يصف نفسه

\n\n

VoiceOver هو قارئ شاشة مدمج في iOS. إنه "ينطق" بكل ما يحدث على الشاشة: النص، الأزرار، الإيماءات. ولكن إذا لم يجهز المطور الواجهة، يمكن أن يتحول VoiceOver إلى فوضى. دعنا نصلح هذا.

\n\n

الإعداد الأساسي: accessibilityLabel و accessibilityTraits

\n\n

أبسط طريقة لمساعدة VoiceOver هي تعيين تسميات وأنواع العناصر. على سبيل المثال، لديك زر بأيقونة قلب. بدون تسمية، سيقول VoiceOver ببساطة "زر"، ولكن مع التسمية سيقول "أضف إلى المفضلة".

\n\n
let favoriteButton = UIButton(type: .system)\nfavoriteButton.setImage(UIImage(systemName: "heart"), for: .normal)\nfavoriteButton.accessibilityLabel = "أضف إلى المفضلة"\nfavoriteButton.accessibilityTraits = .button
\n\n

لاحظ accessibilityTraits. هذا تلميح لـ VoiceOver حول كيفية التفاعل مع العنصر. للزر — .button، للصورة — .image، للعنوان — .header. استخدم .selected، .notEnabled وغيرها لنقل الحالة بدقة.

\n\n

تجميع العناصر: كيف لا تدع VoiceOver "يثرثر" مع المستخدم

\n\n

أحيانًا يكون من المنطقي دمج عدة عناصر في كتلة دلالية واحدة. على سبيل المثال، بطاقة منتج: صورة، اسم، سعر. إذا قرأها VoiceOver بشكل منفصل، سيتعب المستخدم. الحل — UIAccessibilityElement أو shouldGroupAccessibilityChildren.

\n\n
cardView.shouldGroupAccessibilityChildren = true\ncardView.accessibilityLabel = "حذاء Nike Air، 12,990 روبل"\ncardView.accessibilityTraits = .button
\n\n

الآن سيقرأ VoiceOver البطاقة بأكملها كعنصر واحد. باختصار، دقة، وضوح.

\n\n

الإجراءات المخصصة: عندما تحتاج أكثر من مجرد "نقرة"

\n\n

هناك عناصر معقدة: أشرطة التمرير، المفاتيح، قوائم السحب. من المهم إضافة إجراءات مخصصة لها. على سبيل المثال، لخلية تحتوي على وظيفة "حذف" و"تعديل":

\n\n
let deleteAction = UIAccessibilityCustomAction(\n    name: "حذف",\n    target: self,\n    selector: #selector(deleteItem)\n)\nlet editAction = UIAccessibilityCustomAction(\n    name: "تعديل",\n    target: self,\n    selector: #selector(editItem)\n)\ncell.accessibilityCustomActions = [deleteAction, editAction]
\n\n

يقوم مستخدم VoiceOver بالتمرير لأسفل أو لأعلى لاختيار إجراء. هذا يحسن التجربة بشكل كبير.

\n\n

Dynamic Type: نص يتكيف مع كل مستخدم

\n\n

غالبًا ما يقوم الأشخاص ذوو البصر الضعيف بتكبير الخط في إعدادات iOS. إذا كان تطبيقك لا يدعم Dynamic Type، فسيتم قص النص، أو تداخله، أو ببساطة يصبح غير قابل للقراءة. كيف تتجنب هذا؟

\n\n

استخدام أنماط الخطوط الديناميكية

\n\n

بدلاً من UIFont.systemFont(ofSize: 16) الثابت، استخدم UIFont.preferredFont(forTextStyle: .body).

\n\n
label.font = UIFont.preferredFont(forText

المدونات

توصيات الكتب