VoiceOver هو قارئ شاشة مدمج من Apple يقوم بنطق كل عنصر في الواجهة ويسمح بالتحكم في الجهاز باستخدام الإيماءات. التكنولوجيا مدمجة في iOS وiPadOS وmacOS على مستوى النظام ولا تتطلب تثبيت برامج إضافية. وفقًا لـ Apple Accessibility (2025)، يدعم VoiceOver أكثر من 40 لغة ويستخدمه الملايين من المستخدمين المكفوفين وضعاف البصر حول العالم.
الوجبات الرئيسية
VoiceOver هو قارئ شاشة مدمج في أنظمة تشغيل Apple. وهو مصمم للمستخدمين المكفوفين وضعاف البصر ويتيح التفاعل الكامل مع الجهاز دون اتصال بصري. يقوم VoiceOver بنطق جميع عناصر الواجهة: الأزرار، الروابط، النص، الصور، الإشعارات والعناصر النظامية.
تم تقديم التكنولوجيا لأول مرة في عام 2005 لنظام macOS، وظهرت على iOS مع iPhone 3GS في عام 2009. منذ ذلك الحين، أصبح VoiceOver جزءًا لا يتجزأ من نظام Apple البيئي وأحد الحجج الرئيسية لصالح إمكانية الوصول إلى المنصة. VoiceOver مدمج على مستوى النظام — مما يعني أنه يعمل في أي تطبيق دون تكامل إضافي من المطور، على الرغم من أن جودة النطق تعتمد بشكل مباشر على مدى جودة استخدام التطبيق لواجهة برمجة تطبيقات إمكانية الوصول لنظام iOS.
يدعم VoiceOver أكثر من 40 لغة مع تركيب صوت طبيعي ويتكيف مع إعدادات الصوت الإقليمية. على iOS، يستخدم VoiceOver محركات صوت Siri للعربية وعدد من اللغات الأخرى، مما يضمن الصوت الأكثر طبيعية والتنغيم الصحيح اعتمادًا على علامات الترقيم والسياق.
يعترض VoiceOver أحداث اللمس ويفسرها بشكل مختلف عن الإدخال القياسي لنظام iOS. عندما يلمس المستخدم الشاشة، لا يقوم VoiceOver بتنشيط العنصر تحت الإصبع، بل ينطقه أولاً. فقط بعد النقر المزدوج يتم تنشيط العنصر. هذا الاختلاف الرئيسي يسمح للمستخدمين المكفوفين باستكشاف الواجهة دون خطر النقرات العرضية.
يقرأ VoiceOver عناصر الواجهة بترتيب منطقي: من اليسار إلى اليمين، ومن الأعلى إلى الأسفل. يتم توريث ترتيب القراءة من تسلسل العرض في iOS، ولكن يمكن للمطور تغييره من خلال خاصية accessibilityElements للتخطيطات المعقدة. يمكن للمستخدم التنقل بين العناصر عن طريق التمرير لليمين (التالي) ولليسار (السابق)، وكذلك لمس عنصر معين لنطقه.
مع كل حركة، ينطق VoiceOver نوع العنصر (زر، رابط، عنوان)، واسمه (accessibilityLabel)، وحالته (محدد، معطل) وتلميحه (accessibilityHint). إذا كان العنصر يحتوي على قيمة — على سبيل المثال، شريط تمرير الصوت — فإن VoiceOver ينطقها أيضًا. سمات إمكانية الوصول (UIAccessibilityTraits) تخبر المستخدم أيضًا عن سلوك العنصر: هل هو زر أم مفتاح تبديل أم حقل بحث أم مفتاح لوحة مفاتيح.
العجلة هي قرص ضبط افتراضي يغير وضع التنقل في VoiceOver. يدور المستخدم العجلة بإصبعين (مثل مقبض الصوت) ويختار وضعًا: كلمات، أحرف، عناوين، روابط، نقاط دخول، صفوف جدول وغيرها. وضع العناوين يسمح بالتبديل السريع بين H1-H6 في صفحات الويب والتطبيقات، بينما وضع الأحرف ينطق النص حرفًا بحرف، وهو مفيد عند ملء النماذج أو إدخال رموز التحقق.
يمكن للمطور إضافة أوضاع مخصصة إلى العجلة من خلال واجهة برمجة تطبيقات UIAccessibilityCustomRotor. على سبيل المثال، في تطبيق الملاحظات، يمكن إضافة عجلة «الملاحظات المفضلة» أو «التغييرات الأخيرة». العجلات المخصصة تسرع التنقل بشكل كبير في التطبيقات المحددة وتعتبر أفضل ممارسة لإمكانية الوصول على iOS.
يستخدم VoiceOver مجموعته الخاصة من الإيماءات التي لا تتطابق مع إيماءات iOS القياسية. يتم تنفيذ معظم الإيماءات بثلاثة أصابع بدلاً من واحدة — وهذا يمنع التعارض مع التشغيل العادي ويسمح لـ VoiceOver بالعمل بالتزامن مع الإدخال القياسي.
| الإجراء | الإيماءة | النتيجة |
|---|---|---|
| نطق العنصر | لمسة بإصبع واحد | ينطق اسم العنصر |
| تفعيل | نقر مزدوج | الضغط على زر أو رابط |
| العنصر التالي | تمرير لليمين | الانتقال إلى التالي |
| العنصر السابق | تمرير لليسار | العودة إلى السابق |
| التمرير | تمرير بثلاثة أصابع | تمرير القائمة أو الصفحة |
| العجلة | دوران بإصبعين | تغيير وضع التنقل |
إيماءة النقر المزدوج هي الطريقة الرئيسية لتفعيل العناصر في VoiceOver. إذا كان العنصر يتطلب إجراءً خاصًا (على سبيل المثال، السحب)، يستخدم VoiceOver التسلسل «لمسة — نقر مزدوج واستمرار» للدخول إلى وضع الحركة. هذا يسمح بتنفيذ إيماءات معقدة مثل السحب والإفلات دون رؤية الشاشة. يدعم VoiceOver أيضًا إيماءة «النقر المزدوج بإصبعين» لإلغاء الإجراء و«النقر الثلاثي» لتشغيل/إيقاف ستارة الشاشة (Screen Curtain).
يمكن لمطور تطبيقات iOS تحسين التفاعل مع VoiceOver بشكل كبير من خلال واجهة برمجة تطبيقات UIAccessibility. تتم إضافة إعدادات إمكانية الوصول الأساسية في Interface Builder (Identity Inspector ← Accessibility)، لكن الواجهات المعقدة تتطلب تكوينًا برمجيًا في الكود.
خاصية accessibilityLabel تحدد النص الذي ينطقه VoiceOver للعنصر. إذا لم يتم تعيين تسمية، يستخدم VoiceOver نص الزر أو النص المكاني لحقل النص. للعناصر بدون نص (أيقونات، طرق عرض مخصصة)، التسمية إلزامية. خاصية accessibilityTraits تحدد نوع العنصر: زر، عنوان، مفتاح تبديل، حقل بحث، مفتاح لوحة مفاتيح، قيمة متغيرة، رابط وغيرها.
let profileButton = UIButton(type: .custom)
profileButton.setImage(UIImage(named: "avatar"), for: .normal)
profileButton.isAccessibilityElement = true
profileButton.accessibilityLabel = "ملف المستخدم"
profileButton.accessibilityTraits = .button
profileButton.accessibilityHint = "يفتح شاشة إعدادات الملف الشخصي"
العلامة isAccessibilityElement تفعل دعم VoiceOver لطرق العرض المخصصة — افتراضيًا تكون صحيحة فقط للعناصر القياسية (UIButton وUILabel وUITextField). معامل accessibilityHint يضيف تلميحًا: ينطقه VoiceOver بعد توقف إذا توقف المستخدم على عنصر. يجب أن يصف التلميح نتيجة الإجراء، وليس التعليمات: «يفتح شاشة الإعدادات» بدلاً من «اضغط للفتح».
للشاشات المعقدة حيث لا تتطابق المجموعة المنطقية للعناصر مع الترتيب البصري، يتم استخدام accessibilityElements — مصفوفة تحدد ترتيب القراءة. على سبيل المثال، بطاقة المنتج تحتوي على صورة واسم وسعر وزر «أضف إلى السلة». إذا كانت هذه العناصر مرتبة بشكل عشوائي في تسلسل العرض، فإن accessibilityElements يحدد الترتيب الصحيح لـ VoiceOver.
let productCard = UIView()
let productImage = UIImageView()
let productName = UILabel()
let productPrice = UILabel()
let addToCartButton = UIButton()
productCard.accessibilityElements = [
productImage, productName, productPrice, addToCartButton
]
لدمج عناصر متعددة في عنصر واحد يمكن الوصول إليه، يتم استخدام UIAccessibilityContainer أو accessibilityFrame لتجاوز منطقة اللمس. هذا مفيد عندما تحتوي خلية جدول على عدة مكونات واجهة ولكنها تمثل منطقيًا عنصرًا واحدًا — يجب أن ينطق VoiceOver الخلية بأكملها ككل، وليس التنقل عبر محتوياتها بشكل فردي.
يتطلب التكوين الصحيح لإمكانية الوصول لـ VoiceOver الانتباه إلى عدة جوانب: الترميز الدلالي، التحديثات الديناميكية، معالجة العناصر المخصصة والاختبار مع قارئ شاشة حقيقي.
في SwiftUI، يتم تكوين إمكانية الوصول من خلال معدّلات .accessibilityLabel() و.accessibilityValue() و.accessibilityHint() و.accessibilityAddTraits(). يرث SwiftUI تلقائيًا إمكانية الوصول من العناصر القياسية، لكن المكونات المخصصة تتطلب تكوينًا صريحًا. على سبيل المثال، يجب أن يبلغ شريط التمرير المخصص VoiceOver بقيمته وتنسيق التغيير.
Slider(value: $volume, in: 0...100)
.accessibilityLabel("مستوى الصوت")
.accessibilityValue(
Text("\(Int(volume)) في المئة")
)
.accessibilityAddTraits(.adjustsAudioForAccessibility)
.accessibilityAdjustableAction { direction in
switch direction {
case .increment: volume = min(volume + 5, 100)
case .decrement: volume = max(volume - 5, 0)
}
}
معدّل accessibilityAdjustableAction يضيف القدرة على تغيير القيم بإيماءات VoiceOver: التمرير لأعلى للزيادة، التمرير لأسفل للتقليل. بدون هذا المعدّل، سيبقى شريط التمرير غير قابل للوصول للتحكم عبر قارئ الشاشة. تكوين مماثل مطلوب للمُدرجات المخصصة والمنتقيّات والعناصر الأخرى التي تغير قيمتها.
عندما يتغير المحتوى على الشاشة ديناميكيًا (يظهر إشعار، تتغير حالة التحميل، يتغير سعر)، يجب أن يتلقى VoiceOver إشعارًا عبر UIAccessibility.post. بدون هذا الاستدعاء، لن يعرف قارئ الشاشة عن التغييرات وسيفوت المستخدم معلومات مهمة. بالنسبة لـ SwiftUI، يتم استخدام معدّل .accessibilityAnnouncement().
UIAccessibility.post(
notification: .announcement,
argument: "تم تخفيض السعر بنسبة 20 في المئة"
)
// SwiftUI
Text("تم تحديث السعر")
.accessibilityAnnouncement(Text("خصم 20%"))
يجب استخدام إشعارات VoiceOver بشكل مدروس: الإعلانات المفرطة تزعج المستخدم، بينما غيابها يجعل التطبيق غير قابل للوصول. الاستراتيجية المثلى هي الإعلان فقط عن التغييرات التي تؤثر على سير العمل الحالي للمستخدم: تحديثات السلة، حالة التحميل، خطأ التحقق من صحة النموذج، إشعار الدردشة. التغييرات الخلفية (الوقت على اللوحة، أسعار العملات) لا تتطلب إعلانًا — سيتحقق منها المستخدم عند الحاجة.
يتم اختبار VoiceOver باستخدام جهاز فعلي مع تشغيل قارئ الشاشة أو محاكي iOS مع خيار مفتش إمكانية الوصول (Accessibility Inspector). من المهم اختبار سيناريوهات الاستخدام الكامل: إكمال التسجيل، تقديم طلب، العثور على منتج بالبحث دون تحكم بصري. إذا كان المسار قابلًا للتنقل دون ردود فعل بصرية — فإن VoiceOver مهيأ بشكل صحيح.
الأسئلة الشائعة
الإعدادات ← إمكانية الوصول ← VoiceOver. قم بتشغيل المفتاح. للتفعيل السريع، استخدم النقر الثلاثي للزر الجانبي (على iPhone X والأحدث) أو زر الصفحة الرئيسية. يمكن Siri أيضًا تشغيل VoiceOver بأمر «شغّل VoiceOver».
VoiceOver هو قارئ شاشة Apple لنظام iOS، وTalkBack هو قارئ شاشة Google لنظام Android. مبدأ العمل نفسه: اللمس ينطق، النقر المزدوج يفعل. الفرق في الإيماءات وإعدادات العجلة وتكاملات النظام البيئي: VoiceOver أكثر تكاملاً مع iCloud وApple Pay.
استخدم واجهة برمجة تطبيقات UIAccessibility: عيّن accessibilityLabel لجميع العناصر، وaccessibilityTraits لنوع العنصر وaccessibilityHint للتلميحات. في SwiftUI، استخدم معدّلات .accessibilityLabel() و.accessibilityAddTraits(). اختبر التطبيق مع تشغيل VoiceOver.
العجلة هي وضع تنقل يتم تغييره بتدوير إصبعين. تحدد كيفية التنقل بين العناصر: حسب العناوين أو الأحرف أو الكلمات أو الروابط أو نقاط الدخول. يمكن للمطورين إضافة أوضاعهم الخاصة من خلال UIAccessibilityCustomRotor.
بالنسبة لـ UIView المخصص، يجب تعيين isAccessibilityElement = true وتوفير accessibilityLabel. إذا كان العنصر يتكون من عدة طرق عرض فرعية، استخدم accessibilityElements لتعيين ترتيب القراءة أو ادمجها في حاوية.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا