الفرق بين المراجعتين ل"ReactNative/accessibility"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
ط
 
(5 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:سهولة الوصول في React Native}}</noinclude>
+
<noinclude>{{DISPLAYTITLE:الشمولية: سهولة استخدام تطبيقات React Native}}</noinclude>
==سهولة الوصول (Accessibility) في التطبيقات الأصيلة (iOS وAndroid)==
+
يوفّر كل من نظامي التشغيل iOS وAndroid عروض برمجيّة لجعل التطبيقات متاحةً للأشخاص ذوي الإعاقات. إضافةً إلى أنّ النظامين كليهما يوفّران تقنيات مساعدة (assistive technologies)، مثل قارئَي الشّاشة VoiceOver (في iOS) وتقنية TalkBack (في Android) لضِعاف البصر. وبالمثل، يحتوي إطار React Native على عروض برمجيّة مُصمّمة لتزويد المطورين بأدواتٍ تُساعد على تسهيل استعمال التطبيقات وشمل كل المستخدمين بغض النظر عن أي مشاكل تعيق استعمالهم للتطبيق. لاحظ أن نظامي iOS و Android يختلفان اختلافًا طفيفًا في طريقة العمل، وبالتالي فقد تختلف طريقة العمل كذلك في React Native حسب المنصّة.
يوفّر كل من نظامي التشغيل iOS وAndroid واجهات برمجيّة لجعل التطبيقات متاحة للأشخاص ذوي الإعاقات. إضافةً إلى أنّ كلا النظامين يوفّران تقنيات مساعدة (assistive technologies)، مثل قارئَي الشّاشة VoiceOver (في iOS) وTalkBack (في Android) لضِعاف البصر. وبالمثل، يحتوي إطار React Native على واجهات برمجيّة مُصمّمة لتزويد المطورين بأدواتٍ تُساعد على تسهيل الوصول إلى التطبيقات. لاحظ أن نظامي iOS و Android يختلفان اختلافًا طفيفًا في طريقة العمل، وبالتالي فقد تختلف طريقة العمل كذلك في React Native حسب المنصّة.
 
  
إضافةً إلى هذا التوثيق، قد يُفيدك كذلك [https://code.facebook.com/posts/435862739941212/making-react-native-apps-accessible/ هذا المقال] حول سهولة الوصول في React Native.
+
'''ملاحظة''': كلمة شمولية وسهولة وصول هما مصطلحان مترادفان يشيران إلى المصطلح الأجنبي Accessibility.
  
==تسهيل الوصول إلى التطبيقات==
+
==خاصيات سهولة الوصول==
===خاصيات سهولة الوصول===
+
===‎<code>accessible</code>‎ (في iOS وAndroid)===
====‎<code>accessible</code>‎ (في iOS وAndroid)====
+
عندما تكون قيمتُها القيمةَ ‎<code>true</code>‎، فذلك يشير إلى أنّ الواجهة (view) هي عنصرُ يملك ميزات سهولة وصول. وعندها سيُجمّع أبناءه في مكونٍ واحد قابل للتحديد. افتراضيًّا، يمكن الوصول إلى جميع العناصر القابلة للمس (touchable elements).
عندما تكون قيمتُها القيمةَ ‎<code>true</code>‎، فذلك يشير إلى أنّ العرض (view) هو عنصرُ سهولةِ وصولٍ. عندما يكون العرض عنصرَ سهولة وصول، فإنه يُجمّع أطفاله في مكون واحد قابل للتحديد. افتراضيًّا، يمكن الوصول إلى جميع العناصر القابلة لللمس (touchable elements).
 
  
على Android، ستُترجَم خاصيّة ‎<code>accessible={true}</code>‎ على عرضِ ‎<code>View</code>‎ إلى الخاصيّة الأصيلة ‎<code>focusable={true}</code>‎.
+
على Android، ستُترجَم خاصيّة ‎<code>accessible={true}</code>‎ على الواجهة ‎<code>View</code>‎ إلى الخاصيّة الأصيلة ‎<code>focusable={true}</code>‎.
 
<syntaxhighlight lang="javascript">
 
<syntaxhighlight lang="javascript">
 
<View accessible={true}>
 
<View accessible={true}>
سطر 17: سطر 15:
 
</View>
 
</View>
 
</syntaxhighlight>
 
</syntaxhighlight>
في المثال أعلاه، لا يمكننا الحصول على تركيزِ سهولة وصولٍ بشكل منفصلٍ لكلّ من <code>"text one"</code> و <code>"text two"</code>. ونحصل بدلاً من ذلك على تركيزٍ على عرضٍ أبٍ يحمل الخاصية ‎<code>accessible</code>‎‎.
+
في المثال أعلاه، لا يمكننا الحصول على تركيزِ سهل الوصول بشكل منفصلٍ لكلّ من <code>"text one"</code> و <code>"text two"</code>. ونحصل بدلًا من ذلك على تركيزٍ على واجهة أبٍ تحمل الخاصية ‎<code>accessible</code>‎‎.
====‎<code>accessibilityLabel</code>‎ (في iOS وAndroid)====
+
===‎<code>accessibilityLabel</code>‎ ===
عندما يُعلَّم عرضٌ على أنه عنصرُ سهولة وصولٍ، فسيُفيد تعيين خاصيّة ‎<code>accessibilityLabel</code>‎ لتُوفِّر تسميّةً للعرض، بحيث يعرف الأشخاص الذين يستخدمون VoiceOver العنصر الذي حدّدوه. إذ سيقرأ VoiceOver هذه السلسلة النّصيّة عندما يحدِّد المستخدم العنصر ذا الصّلة.
+
عندما تعلَّم واجهة على أنها عنصرُ سهل الوصول، فسيُفيد تعيين خاصيّة ‎<code>accessibilityLabel</code>‎ لتُوفِّر تسميّةً للواجهة، بحيث يعرف الأشخاص الذين يستخدمون القارئ VoiceOver العنصر الذي حدّدوه. إذ سيقرأ القارئ VoiceOver هذه السلسلة النّصيّة عندما يحدِّد المستخدم العنصر ذا الصّلة.
  
لاستخدام هذه الميّزة، عيّن الخاصية ‎<code>accessibilityLabel</code>‎ إلى سلسلةٍ نصيّةٍ مخصّصة على مكوّن ‎<code>View</code>‎، أو ‎<code>Text</code>‎، أو ‎أي مكوّن قابلٍ لللمس:
+
لاستخدام هذه الميّزة، عيّن الخاصية ‎<code>accessibilityLabel</code>‎ إلى سلسلةٍ نصيّةٍ مخصّصة على مكوّن ‎<code>View</code>‎، أو ‎<code>Text</code>‎، أو ‎أي مكوّن قابلٍ للمس:
 
<syntaxhighlight lang="javascript">
 
<syntaxhighlight lang="javascript">
 
<TouchableOpacity
 
<TouchableOpacity
 
   accessible={true}
 
   accessible={true}
 
   accessibilityLabel="Tap me!"
 
   accessibilityLabel="Tap me!"
   onPress={this._onPress}>
+
   onPress={onPress}>
 
   <View style={styles.button}>
 
   <View style={styles.button}>
 
     <Text style={styles.buttonText}>Press me!</Text>
 
     <Text style={styles.buttonText}>Press me!</Text>
سطر 32: سطر 30:
 
</TouchableOpacity>
 
</TouchableOpacity>
 
</syntaxhighlight>
 
</syntaxhighlight>
في المثال أعلاه، ستكون القيمةُ الافتراضيّةُ لخاصيّة ‎<code>accessibilityLabel</code>‎ على المكوّن <code>TouchableOpacity</code> القيمةَ ‎<code>"Press me!"</code>‎. تُنشأ القيمةُ عبر تجميع جميع نصوص ‎<code>Text</code>‎ الأطفال مفصولة بمسافات.
+
في المثال أعلاه، ستكون القيمةُ الافتراضيّةُ لخاصيّة ‎<code>accessibilityLabel</code>‎ على المكوّن <code>TouchableOpacity</code> القيمةَ ‎"Press me!"‎. تُنشأ القيمةُ عبر تجميع جميع نصوص ‎Text‎ الأبناء مفصولة بمسافات.
  
====‎<code>accessibilityHint</code>‎ (في iOS وAndroid)====
+
===‎<code>accessibilityHint</code>‎ ===
 
يساعد تلميح سهولة الوصول (accessibility hint) المستخدمينَ على فهم ما سيحدث عند القيام بشيءٍ ما على عنصرٍ عندما لا تكون هذه النتيجة واضحةً من تسميّة سهولة الوصول (accessibility label).
 
يساعد تلميح سهولة الوصول (accessibility hint) المستخدمينَ على فهم ما سيحدث عند القيام بشيءٍ ما على عنصرٍ عندما لا تكون هذه النتيجة واضحةً من تسميّة سهولة الوصول (accessibility label).
  
لاستخدام هذه الميّزة، عيّن الخاصية ‎<code>accessibilityHint</code>‎ إلى سلسلةٍ نصيّةٍ مخصّصة على مكوّن ‎<code>View</code>‎، أو ‎<code>Text</code>‎، أو ‎أي مكوّن قابلٍ لللمس:
+
لاستخدام هذه الميّزة، عيّن الخاصية ‎<code>accessibilityHint</code>‎ إلى سلسلةٍ نصيّةٍ مخصّصة على مكوّن ‎<code>View</code>‎، أو ‎<code>Text</code>‎، أو ‎أي مكوّن قابلٍ للمس:
 
<syntaxhighlight lang="javascript">
 
<syntaxhighlight lang="javascript">
 
<TouchableOpacity
 
<TouchableOpacity
سطر 43: سطر 41:
 
   accessibilityLabel="رجوع"
 
   accessibilityLabel="رجوع"
 
   accessibilityHint="الانتقال إلى الشّاشة السّابقة"
 
   accessibilityHint="الانتقال إلى الشّاشة السّابقة"
   onPress={this._onPress}>
+
   onPress={onPress}>
 
   <View style={styles.button}>
 
   <View style={styles.button}>
     <Text style={styles.buttonText}>رجوع</Text>
+
     <Text style={styles.buttonText}>Back</Text>
 
   </View>
 
   </View>
 
</TouchableOpacity>
 
</TouchableOpacity>
 
</syntaxhighlight>
 
</syntaxhighlight>
'''سلوك المثال أعلاه في منصّة iOS:''' سيقرأ VoiceOver التلميح بعد قراءة التسمية إذا كان المستخدم قد فعَّل التلميحات في إعدادات VoiceOver الخاصة بالجهاز. اقرأ المزيد حول ‎ <code>accessibilityHint</code>على [https://developer.apple.com/documentation/objectivec/nsobject/1615093-accessibilityhint توثيق مطوري iOS].
+
'''سلوك المثال أعلاه في منصّة iOS:''' سيقرأ القارئ VoiceOver التلميح بعد قراءة التسمية إذا كان المستخدم قد فعَّل التلميحات في إعدادات القارئ VoiceOver الخاصة بالجهاز. اقرأ المزيد حول ‎ <code>accessibilityHint‎</code> على [https://developer.apple.com/documentation/objectivec/nsobject/1615093-accessibilityhint توثيق مطوري iOS].
'''سلوك المثال أعلاه في منصّة Android:''' سيقرأ Talkback التلميح بعد قراءة التسمية. لا يمكن في الوقت الحالي تعطيل التلميحات على Android.
 
  
====‎<code>accessibilityIgnoresInvertColors</code>‎ (في iOS فقط)====
+
'''سلوك المثال أعلاه في منصّة Android:''' سيقرأ القارئ Talkback التلميح بعد قراءة التسمية. لا يمكن في الوقت الحالي تعطيل التلميحات على Android.
عكس ألوان الشاشة ميزةُ سهولةِ وصولٍ تجعل شاشات iPhone و iPad  أريَح للعينين للأشخاص ذوي حساسيةٍ تجاه السطوع، وسهلَة التمييز للأشخاص الذين يعانون من عمى الألوان وللأشخاص الذين يعانون من ضعف في الرؤية. لكن أحيانًا تحتاج إلى عرض عروضٍ مثل الصور دون عكس ألوانها. في هذه الحالة، يمكنك تعيين هذه الخاصيّة لتكون القيمةَ <code>false</code> كي لا تُعكَس ألوان هذه العروض المحددة.
 
  
====‎<code>accessibilityRole</code>‎ (في iOS وAndroid)====
+
===‎<code>accessibilityIgnoresInvertColors</code>‎ (في iOS فقط)===
'''ملاحظة:''' الخاصيّتان <code>accessibilityRole</code> و‎<code>accessibilityStates</code>‎ مُصمّمتان لتكونا حلًّا عابرًا للمنصّات (cross-platform) بدلًا من ‎<code>accessibilityTraits</code>‎ و‎<code>accessibilityComponentType</code>‎، اللتان ستُهمَلان (deprecated) قريبًا. استخدم  <code>accessibilityRole</code> و‎<code>accessibilityStates</code>‎ عوضًا عن ‎<code>accessibilityTraits</code>‎ و‎<code>accessibilityComponentType</code>‎ متى أمكن ذلك.
+
عكس ألوان الشاشة هي ميزةُ سهولةِ وصولٍ تجعل شاشات iPhone و iPad  مريحةً لعيني الأشخاص ذوي حساسيةٍ تجاه السطوع، وسهلَة التمييز للأشخاص الذين يعانون من عمى الألوان وللأشخاص الذين يعانون من ضعف في الرؤية. لكن أحيانًا تحتاج إلى عرض عروضٍ مثل الصور دون عكس ألوانها. في هذه الحالة، يمكنك تعيين هذه الخاصيّة لتأخذ القيمةَ <code>false</code> كي لا تُعكَس ألوان هذه العروض المحددة.
  
يُعلِمُ دور سهولة الوصول (Accessibility Role) مُستخدمَ VoiceOver على iOS أو TalkBack على Android عن نوع العنصر المُركَّز عليه. لاستخدام هذه الميّزة، عيّن الخاصية <code>accessibilityRole</code>‎ إلى إحدى السلاسل النّصيّة التالية:
+
===<code>accessibilityLiveRegion</code> (في Android فقط) ===
 +
نريد أن ينبه القارئ  Talkback المستخدم النهائي عندما تتغير المكونات بشكلٍ ديناميكيّ، وهذا ممكن باستخدام الخاصية <code>accessibilityLiveRegion</code>. والتي تأخذ إحدى القيم التالية:
  
* <code>none</code>: لا دور للعنصر.
+
* <code>none</code>: لا تعلن خدمات سهولة الوصول عن التغييرات لهذه الواجهة.
* <code>button</code>: تجب معاملة العنصر كَزِرٍّ.
+
* <code>polite</code>: يجب أن تعلن خدمات سهولة الوصول عن التغييرات لهذه الواجهة.
* <code>link</code>: تجب معاملة العنصر كَرابطٍ.
+
* <code>assertive</code>: يجب أن تقاطع خدمات سهولة الوصول الكلام الجاري للإعلان فورًا عن التغييرات التي تطرأ على هذه الواجهة.
* ‎<code>search</code>‎: تجب مُعاملة عنصر حقل النص كحقل بحث كذلك.
+
<syntaxhighlight lang="javascript">
* ‎<code>image</code>‎: يجب التعامل مع العنصر كصورةٍ. يمكن جمعها مع زر أو رابط مثلًا.
+
<TouchableWithoutFeedback onPress={addOne}>
* ‎<code>keyboardkey</code>‎:يعمل العنصر كمفتاح لوحة مفاتيحٍ.
+
  <View style={styles.embedded}>
* ‎<code>text</code>‎: يجب التعامل مع العنصر كنص ثابت لا يمكن تغييره.
+
    <Text>Click me</Text>
* ‎<code>adjustable</code>‎: عنصرٌ يمكنُ ضبطه وتعديله (شريط تمريرٍ  [slider]مثلًا).
+
  </View>
* ‎<code>imagebutton</code>‎: يجب التعامل مع العنصر على أنه زر، وهوَ صورة كذلك.
+
</TouchableWithoutFeedback>
* ‎<code>header</code>‎: يعمل العنصر كعنوانٍ لقسم من أقسام المحتوى (كعنوان شريط التنقل مثلًا).
+
<Text accessibilityLiveRegion="polite">
* ‎<code>summary</code>‎: يمكن استخدام العنصر لتوفير ملخص سريع للظروف الحالية في التطبيق عند تشغيل التطبيق.
+
  Clicked {count} times
 +
</Text>
 +
</syntaxhighlight>‎في المثال أعلاه تغير الدالة <code>addOne</code> متحول الحالة <code>count</code>مباشرة عندما يضغط المستخدم <code>TouchableWithoutFeedback</code>، يقرأ القارئ TalkBack النص في الواجهة النصية <code>Text</code> لأن الخاصية <code>accessibilityLiveRegion</code> تأخذ القيمة <code>polite</code>.
  
====‎<code>accessibilityStates</code>‎ (في iOS وAndroid)====
+
===<code>accessibilityRole</code>‎ ===
'''ملاحظة:''' الخاصيّتان <code>accessibilityRole</code> و‎<code>accessibilityStates</code>‎ مُصمّمتان لتكونا حلًّا عابرًا للمنصّات (cross-platform) بدلًا من ‎<code>accessibilityTraits</code>‎ و‎<code>accessibilityComponentType</code>‎، اللتان ستُهملان (deprecated) قريبًا. استخدم  <code>accessibilityRole</code> و‎<code>accessibilityStates</code>‎ عوضًا عن ‎<code>accessibilityTraits</code>‎ و‎<code>accessibilityComponentType</code>‎ متى أمكن ذلك.
+
‎تحدد هذه الخاصية الغرض من المكون لكي يتعرف عليه المستخدم للتكنولوجيا المساعدة. وتأخذ إحدى القيم التالية:
  
تُعلِمُ حالة سهولة الوصول (Accessibility State) مُستخدمَ VoiceOver على iOS أو TalkBack على Android عن حالة العنصر المُركَّز عليه حاليًّا. يمكن تعيين حالة العنصر إمّا إلى القيمة ‎<code>selected</code>‎ أو إلى القيمة ‎<code>disabled</code>‎ أو كليهما:
+
* ‎adjustable: تستخدم عندما يكون العنصر قابلًا للتعديل (كشريط تمرير slider).
 +
* alert: يستخدم عندما يحتوي العنصر على نص مهم ليقدَّم للمستخدم.
 +
* ‎button‎: تجب معاملة العنصر كَزِرٍّ.
 +
* checkbox: تستخدم عندما يكون العنصر مربع اختيار يمكن تحديده أو إلغاء اختياره أو وجود حالة اختيار مختلطة.
 +
* combobox: يستخدم عندما يمثل العنصر مربع خيارات متعددة، مما يسمح للمستخدم بالاختيار من بين عدة خيارات.
 +
* ‎header‎: تستخدم عندما يعمل العنصر كعنوانٍ لقسم من أقسام المحتوى (كعنوان شريط التنقل مثلًا).
 +
* ‎image‎: تستخدم عندما يجب التعامل مع العنصر كصورةٍ. يمكن جمعها مع زر أو رابط مثلًا.
 +
* ‎imagebutton‎: تستخدم عندما يجب التعامل مع العنصر على أنه زر، وهوَ صورة كذلك.
 +
* ‎keyboardkey‎: تستخدم عندما يعمل العنصر كمفتاح لوحة مفاتيحٍ.
 +
* ‎link‎: تستخدم عندما يجب معاملة العنصر كَرابطٍ.
 +
* menu: يُستخدم عندما يكون المكون عبارة عن قائمة اختيارات.
 +
* menubar: تُستخدم عندما يكون العنصر عبارة عن حاوية قوائم متعددة.
 +
* menuitem: تستخدم لتمثيل عنصر داخل قائمة.
 +
* none‎: لا دور للعنصر.
 +
* progressbar: يستخدم لتمثيل مكون يشير إلى تقدم المهمة.
 +
* radio: تستخدم لتمثيل زر اختيار.
 +
* radiogroup: تستخدم لتمثيل مجموعة من أزرار الاختيار.
 +
* scrollbar: تستخدم لتمثيل شريط التمرير.
 +
* search: يُستخدم عندما يجب معاملة عنصر حقل النص كحقل بحث أيضًا.
 +
* spinbutton: يستخدم لتمثيل زر يفتح قائمة خيارات.
 +
* ‎summary‎: يمكن استخدام العنصر لتوفير ملخص سريع للظروف الحالية في التطبيق عند تشغيل التطبيق.
 +
* switch: تستخدم لتمثيل مفتاح يمكن تشغيله وإيقافه.
 +
* tab: تستخدم لتمثيل علامة تبويب.
 +
* tablist: تستخدم لتمثيل قائمة من علامات التبويب.
 +
* ‎text‎: يجب التعامل مع العنصر كنص ثابت لا يمكن تغييره.
 +
* timer: تستخدم لتمثيل مؤقت.
 +
* toolbar: يستخدم لتمثيل شريط الأدوات (حاوية أزرار إجراءات أو مكونات).
  
* ‎<code>selected</code>‎: العنصر في حالة تحديدٍ. مثلًا: الزّرُ محدّدٌ حاليّا.
+
===‎<code>accessibilityState</code>‎ ===
* ‎<code>disabled</code>‎: العنصر معطّل ولا يمكن التفاعل معه.
+
تصف الحالة الحالية للمكون لمستخدم التكنولوجيا المساعدة. وهي كائن يحوي الحقول التالية:  
 +
{| class="wikitable"
 +
!<small>الاسم</small>
 +
!<small>الوصف</small>
 +
!<small>النمط</small>
 +
!<small>مطلوب</small>
 +
|-
 +
|<small>disabled</small>
 +
|<small>يشير إلى ما إذا كان العنصر معطلاً أم لا.</small>
 +
|<small>قيمة منطقية</small>
 +
|<small>لا</small>
 +
|-
 +
|<small>selected</small>
 +
|<small>يشير إلى ما إذا كان العنصر القابل للتحديد محددًا حاليًا أم لا.</small>
 +
|<small>قيمة منطقية</small>
 +
|<small>لا</small>
 +
|-
 +
|<small>checked</small>
 +
|<small>يشير إلى حالة العنصر القابل للفحص. يمكن أن يأخذ هذا الحقل قيمة منطقية أو سلسلة "مختلطة" لتمثيل مربعات اختيار مختلطة.</small>
 +
|<small>قيمة منطقية (boolean)</small>
 +
|<small>لا</small>
 +
|-
 +
|<small>busy</small>
 +
|<small>يحدد فيما إذا كان العنصر مشغولًا حاليًا أو لم.</small>
 +
|<small>قيمة منطقية (boolean) أو مختلطة</small>
 +
|<small>لا</small>
 +
|-
 +
|<small>expanded</small>
 +
|<small>يشير إلى ما إذا كان العنصر القابل للتوسع موسعًا حاليّا أو مطويًا.</small>
 +
|<small>قيمة منطقية (boolean)</small>
 +
|<small>لا</small>
 +
|}
 +
لاستخدام هذه الميّزة، عيّن الخاصية ‎<code>accessibilityState</code>‎ إلى كائن بتعريف محدد.
  
لاستخدام هذه الميّزة، عيّن الخاصية ‎<code>accessibilityStates</code>‎ إلى مصفوفة تحتوي إمّا القيمةَ ‎<code>selected</code>‎ أو القيمة <code>disabled</code>‎ أو كليهما.
+
===<code>accessibilityValue</code>===
 +
تمثل قيمة المكون الحالية، ويمكن أن تكون وصفًا نصيًّا لقيمته، أو معلومات المجالات في المكونات التي تعتمد المجالات كأشرطة التمرير أو التقدم (كالقيمة الحالية والحدود العليا والدنيا). وهي كائن يحوي الحقول التالية:
 +
{| class="wikitable"
 +
!<small>الاسم</small>
 +
!<small>الوصف</small>
 +
!<small>النمط</small>
 +
!<small>مطلوب</small>
 +
|-
 +
|<small>min</small>
 +
|<small>قيمة الحد الأدنى لمجال المكون</small>
 +
|<small>عدد  (integer)</small>
 +
|<small>فقط عندما تحدد <code>now</code></small>
 +
|-
 +
|<small>max</small>
 +
|<small>قيمة الحد الأعلى لمجال المكون</small>
 +
|<small>عدد  (integer)</small>
 +
|<small>فقط عندما تحدد <code>now</code></small>
 +
|-
 +
|<small>now</small>
 +
|<small>القيمة الحالية لمجال المكون</small>
 +
|<small>عدد (integer)</small>
 +
|<small>لا</small>
 +
|-
 +
|<small>text</small>
 +
|<small>وصف نصي لمجال المكون، وإضا تم تعيينه فسيتجاوز قيم <code>min</code> و <code>max</code> و <code>now</code></small>
 +
|<small>سلسلة نصية (string)</small>
 +
|<small>لا</small>
 +
|}
  
====‎<code>accessibilityTraits</code>‎ (في iOS فقط)====
+
===‎‎<code>accessibilityViewIsModal</code>‎ (في iOS فقط)===
'''ملاحظة:''' ستُهمَل الخاصيّة ‎<code>accessibilityTraits</code>‎ قريبًا. استخدم  <code>accessibilityRole</code> و‎<code>accessibilityStates</code>‎ عوضًا عن ‎<code>accessibilityTraits</code>‎ و‎<code>accessibilityComponentType</code>‎ متى أمكن ذلك.
+
قيمة منطقيةٌ تشير إلى ما إذا كان يجب على القارئ VoiceOver تجاهل العناصر الموجودة في العروض الشّقيقة للمُستقبِل.
  
تُعلِم سمات سُهولة الوصول (Accessibility traits) مستخدِمَ VoiceOver عن نوع العنصر الذي حدده. أهذا العنصر تسميّة؟ أم زر؟ أم عنوان؟ تُجيب الخاصيّةُ ‎<code>accessibilityTraits</code>‎ على هذه الأسئلة.
+
على سبيل المثال، في نافذةٍ تحتوي على واجهتين شقيقين ‎<code>A</code>‎ و‎<code>B</code>‎، سيؤدي تعيين ‎<code>accessibilityViewIsModal</code>‎ إلى القيمة ‎<code>true</code>‎ على الواجهة ‎<code>B</code>‎ إلى تجاهل  VoiceOver لعناصر الواجهة ‎<code>A</code>‎. من ناحية أخرى، إذا كانت الواجهة ‎<code>B</code>‎ تحتوي على واجهة فرعية ‎<code>C</code>‎ وقمت بتعيين الخاصيّة ‎<code>accessibilityViewIsModal</code>‎ إلى القيمة ‎<code>true</code>‎ على الواجهة <code>C</code>‎، فلن يتجاهل VoiceOver العناصر الموجودة في الواجهة ‎<code>A</code>‎.
  
لاستخدام هذه الميّزة، عيّن الخاصية ‎<code>accessibilityTraits</code>‎ إلى أحد السلاسل النصيّة التّاليّة أو إلى مصفوفةٍ تحتوي على عددٍ منها:
+
===‎<code>accessibilityElementsHidden</code>‎ (في iOS فقط)===
* ‎<code>none</code>‎: لا سمةَ للعنصر.
+
قيمةٌ منطقيةٌ تشير إلى ما إذا كانت عناصر سهولة الوصول الموجودة داخل عنصرُ سهولة الوصول الحاليّ مخفيةً أو لا.
* ‎<code>button</code>‎: تجب معاملة العنصر كَزِرٍّ.
 
* ‎<code>link</code>‎: تجب معاملة العنصر كَرابطٍ.
 
* ‎<code>header</code>‎: يعمل العنصر كعنوانٍ لقسم من أقسام المحتوى (كعنوان شريط التنقل مثلًا).
 
* ‎<code>search</code>‎: تجب مُعاملة عنصر حقل النص كحقل بحث كذلك.
 
* ‎<code>image</code>‎: يجب التعامل مع العنصر كصورةٍ. يمكن جمعها مع زر أو رابط مثلًا.
 
* ‎<code>selected</code>‎: العنصر مُحدَّد، كصفّ مُحدَّدٍ في جدولٍ أو زرّ مُحدّد مثلًا.
 
* ‎<code>plays</code>‎: يُشغِّل العنصر صوتًا خاصًّا به عند تنشيطه.
 
* ‎<code>key</code>‎:يعمل العنصر كمفتاح لوحة مفاتيحٍ.
 
* ‎<code>text</code>‎: يجب التعامل مع العنصر كنص ثابت لا يمكن تغييره.
 
* ‎<code>summary</code>‎: يمكن استخدام العنصر لتوفير ملخص سريع للظروف الحالية في التطبيق عند تشغيل التطبيق. على سبيل المثال، عند تشغيل تطبيق الطقس، سيُحدَّد عنصر حالة طقسِ اليومِ بهذه السمة.
 
* ‎<code>disabled</code>‎: التحكم مُعطّل على هذا العنصر ولا يستجيب لمدخلات المستخدم.
 
* ‎<code>frequentUpdates</code>‎: يُحدِّث العنصرُ بشكل متكرر تسميّتَه أو قيمتَه، ولكنّ معدّل التحديثات كبيرٌ وغير مُناسبٍ لإرسال إشعارات التّحديث. هذا يسمح لعميل سهولة الوصول (accessibility client) بإجراء استطلاع للتغييرات (poll for changes). كساعة توقيتٍ مثلًا.
 
* ‎<code>startsMedia</code>‎: يُستخدَم هذا الخيار عندما يبدأ تنشيطُ عنصرٍ ما جلسةَ وسائطٍ (media session)، (كتشغيل مقطعٍ مرئيّ أو تسجيل صوت) بحيث لا ينبغي مقاطعتها من طرَف مُخرَج تقنيةٍ مساعدةٍ مثل VoiceOver.
 
* ‎<code>adjustable</code>‎: عنصرٌ يمكنُ ضبطه وتعديله (شريط تمريرٍ  [slider]مثلًا).
 
* ‎<code>allowsDirectInteraction</code>‎: يسمح العنصرُ بالتفاعل المباشر عن طريق اللمس لمستخدمي VoiceOver (على سبيل المثال، عرضٌ يمثّل لوحة مفاتيح بيانو).
 
* ‎<code>pageTurn</code>‎: يُعلِم هذا الخيارُ المُساعدَ VoiceOver بوجوب الانتقال إلى الصفحة التالية عندما ينتهي من قراءة محتويات العنصر.
 
====‎<code>accessibilityViewIsModal</code>‎ (في iOS فقط)====
 
قيمة منطقيةٌ تشير إلى ما إذا كان يجب على VoiceOver تجاهل العناصر الموجودة في العروض الشّقيقة للمُستقبِل.
 
  
على سبيل المثال، في نافذةٍ تحتوي على عرضين شقيقين ‎<code>A</code>‎ و‎<code>B</code>‎، سيؤدي تعيين ‎<code>accessibilityViewIsModal</code>‎ إلى القيمة ‎<code>true</code>‎ على العرض ‎<code>B</code>‎ إلى تجاهل  VoiceOver لعناصر العرض ‎<code>A</code>‎. من ناحية أخرى، إذا كان العرض ‎<code>B</code>‎ يحتوي على عرضٍ فرعيّ ‎<code>C</code>‎ وقمت بتعيين الخاصيّة ‎<code>accessibilityViewIsModal</code>‎ إلى القيمة ‎<code>true</code>‎ على العرض  ‎<code>C</code>‎، فلن يتجاهل VoiceOver العناصر الموجودة في العرض ‎<code>A</code>‎.
+
على سبيل المثال، في نافذةٍ تحتوي على واجهتين شقيقين ‎<code>A</code>‎ و‎<code>B</code>‎، سيؤدي تعيين ‎<code>accessibilityElementsHidden</code>‎ إلى القيمة ‎<code>true</code>‎ على الواجهة ‎<code>B</code>‎ إلى تجاهل  VoiceOver للعناصر في الواجهة ‎<code>B</code>‎. وهي مُشابهة للخاصيّة ‎<code>importantForAccessibility="no-hide-descendants"</code>‎ في Android.
  
====‎<code>accessibilityElementsHidden</code>‎ (في iOS فقط)====
+
===‎<code>importantForAccessibility</code>‎ (في Android فقط)===
قيمةٌ منطقيةٌ تشير إلى ما إذا كانت عناصر سهولة الوصول الموجودة داخل عنصرُ سهولة الوصول الحاليّ مخفيةً أو لا.
+
في حالة تراكب مكونَين من مكوّنات عرض مستخدم يمتلكان نفس المكوّن الأب، يمكن أن يكون تركيز سهولة الوصول الافتراضي سلوكًا غير متوقع. ستحلّ خاصية ‎<code>importantForAccessibility</code>‎ هذه المشكلة عبر التحكم في ما إذا كان عرضٌ قادرًا على إطلاق أحداث سهولة الوصول وما إذا كانت هذه الأحداث ستُرسَل إلى خدمات سهولة الوصول. يمكن تعيين الخاصيّة إلى القيمة ‎<code>auto</code>‎، أو ‎<code>yes</code>‎، أو ‎<code>no</code>‎، أو ‎<code>no-hide-descendants</code>‎ (تُرغِم هذه القيمةُ الأخيرة خدماتِ سهولة الوصول على تجاهل المكوّن وكل أبنائه).
 +
<syntaxhighlight lang="javascript">
 +
<View style={styles.container}>
 +
  <View
 +
    style={[styles.layout, { backgroundColor: 'green' }]}
 +
    importantForAccessibility="yes">
 +
    <Text>First layout</Text>
 +
  </View>
 +
  <View
 +
    style={[styles.layout, { backgroundColor: 'yellow' }]}
 +
    importantForAccessibility="no-hide-descendants">
 +
    <Text>Second layout</Text>
 +
  </View>
 +
</View>
 +
</syntaxhighlight>
 +
في المثال أعلاه، لن يظهر التخطيط الأصفر وأحفاده أبدًا للقارئ TalkBack ولجميعِ خدمات سهولة الوصول الأخرى. لذلك يمكننا بسهولة استخدام طرق العرض المتداخلة ذات نفس المكوّن الأب دون إرباك أداة TalkBack.
  
على سبيل المثال، في نافذةٍ تحتوي على عرضين شقيقين ‎<code>A</code>‎ و‎<code>B</code>‎، سيؤدي تعيين ‎<code>accessibilityElementsHidden</code>‎ إلى القيمة ‎<code>true</code>على العرض ‎<code>B</code>‎ إلى تجاهل  VoiceOver للعناصر في العرض ‎<code>B</code>‎. وهي مُشابهة للخاصيّة ‎<code>importantForAccessibility="no-hide-descendants"</code>‎ في Android.
+
===<code>onAccessibilityEscape</code> (في iOS فقط) ===
 +
استخدم هذه الخاصية لتعيين دالة مخصصة لاستدعائها عندما تنفَذ المستخدم الإيماءة "escape"،  وهي إيماءة بإصبعين من الشكل Z ، يجب أن تعود هذه الدالة إلى الوراء بشكلٍ هرمي في واجهة المستخدم، وهذا يعني التحرك للأعلى أو للخلف في التسلسل الهرمي للتنقل أو رفض واجهة مستخدم مشروطة. إذا لم يحتو العنصر المحدد على دالة <code>onAccessibilityEscape</code> فسيحاول النظام اجتياز التسلسل الهرمي للعرض حتى يحصل على عرض يعمل أو سيشير إلى أنه غير قادر على إيجاده.
  
====‎<code>onAccessibilityTap</code>‎ (في iOS فقط)====
+
===‎<code>onAccessibilityTap</code>‎ ===
 
استخدم هذه الخاصية لتعيين دالّةٍ مخصصة لاستدعائها عندما يُنشِّط المُستخدم عنصرَ سهولةِ وصولٍ عبر النقر المزدوج (double tapping) عليه أثناء تحديده.
 
استخدم هذه الخاصية لتعيين دالّةٍ مخصصة لاستدعائها عندما يُنشِّط المُستخدم عنصرَ سهولةِ وصولٍ عبر النقر المزدوج (double tapping) عليه أثناء تحديده.
====‎<code>onMagicTap</code>‎ (في iOS فقط)====
+
===‎<code>onMagicTap</code>‎ (في iOS فقط)===
 
استخدم هذه الخاصية لتعيين دالّةٍ مخصصة لاستدعائها عندما يؤدّي المُستخدم إيماءة نقرٍ سحريّ (magic tap) وهيَ نقرٌ مزدوجٌ بإصبعين اثنين. يجب أن تُنجِز دالّةُ النقر السحري أنسَبَ إجراءٍ يمكن للمستخدم إنجازه على المكوّن. في تطبيق الهاتف على جهاز iPhone، يُجيب النّقر السّحري على مكالمةٍ هاتفية أو يُنهي الاتصال الحالي. إذا لم يحتوِ العنصرُ المحدَّد على دالّة <code>onMagicTap</code>، فسينتقل النظام إلى أعلى تسلسل العروض الهرمي (view hierarchy) إلى أن يصِل إلى عرضٍ يحتوي على هذه الدّالة.
 
استخدم هذه الخاصية لتعيين دالّةٍ مخصصة لاستدعائها عندما يؤدّي المُستخدم إيماءة نقرٍ سحريّ (magic tap) وهيَ نقرٌ مزدوجٌ بإصبعين اثنين. يجب أن تُنجِز دالّةُ النقر السحري أنسَبَ إجراءٍ يمكن للمستخدم إنجازه على المكوّن. في تطبيق الهاتف على جهاز iPhone، يُجيب النّقر السّحري على مكالمةٍ هاتفية أو يُنهي الاتصال الحالي. إذا لم يحتوِ العنصرُ المحدَّد على دالّة <code>onMagicTap</code>، فسينتقل النظام إلى أعلى تسلسل العروض الهرمي (view hierarchy) إلى أن يصِل إلى عرضٍ يحتوي على هذه الدّالة.
====‎<code>accessibilityComponentType</code>‎ (في Android فقط)====
 
'''ملاحظة:''' ستُهمَل الخاصيّة ‎<code>accessibilityComponentType</code>‎ قريبًا. استخدم  <code>accessibilityRole</code> و‎<code>accessibilityStates</code>‎ عوضًا عن ‎<code>accessibilityTraits</code>‎ و‎<code>accessibilityComponentType</code>‎ متى أمكن ذلك.
 
  
في بعض الحالات، قد نرغب كذلك بتنبيه المستخدم عن نوع المكون المحدَّد (أي إخباره مثلًا أنّ هذا المُكوِّن زرٌّ قابل للضغط). إذا كنّا نستخدم أزرارًا أصيلة، فسيعمل هذا تلقائيًا. لكن لأنّنا نستخدم JavaScript، فإنّنا نحتاج إلى توفير سياقٍ أكثر لأداة TalkBack. للقيام بهذا، يجب عليك تحديد الخاصية ‎<code>accessibilityComponentType</code>في أي مكون من مكونات واجهة المستخدم (UI component). تدعم هذه الخاصيّة القيم: ‎<code>none</code>‎، و‎<code>button</code>‎، و‎<code>radiobutton_checked</code>‎، و‎<code>radiobutton_unchecked</code>.
+
== إجراءات سهولة الوصول ==
<syntaxhighlight lang="javascript">
+
تساعد إجراءات سهولة الوصول التقنية المساعدة على استدعاء إجراءات المكون برمجيًا، ولدعم الإجراءات يجب أن يقوم المكون بأمرين:
<TouchableWithoutFeedback accessibilityComponentType="button"
+
 
   onPress={this._onPress}>
+
* تعريف الإجراءات التي يدعمها في الخاصية <code>accessibilityActions</code>.
   <View style={styles.button}>
+
* تنفيذ الدالة <code>onAccessibilityAction</code> للتعامل مع طلبات الإجراء.
     <Text style={styles.buttonText}>Press me!</Text>
+
 
   </View>
+
يجب أن تحوي الخاصية <code>accessibilityActions</code> قائمة من أغراض الإجراءات، يحوي كل غرض منها الحقول التالية:
</TouchableWithoutFeedback>
+
{| class="wikitable"
 +
!<small>الاسم</small>
 +
!<small>النمط</small>
 +
!<small>مطلوب</small>
 +
|-
 +
|<small>name</small>
 +
|<small>سلسلة نصية (string)</small>
 +
|<small>نعم</small>
 +
|-
 +
|<small>label</small>
 +
|<small>سلسلة نصية (string)</small>
 +
|<small>لا</small>
 +
|}
 +
يمكن أن تكون الإجراءات قياسية، كالضغط على زر أو ضبط شريط تمرير، أو إجراءات مخصصة لمكون محدّد كحذف رسالة بريد إلكتروني، والحقل <code>name</code> مطلوب لكلا النوعين، لكن الحقل <code>label</code> اختياري في الإجراءات القياسية.
 +
 
 +
عند إضافة الدعم للإجراءات القياسية يجب أن تكون للحقل <code>name</code> إحدى القيم التالية:
 +
 
 +
* <code>'magicTap'</code> : (في iOS فقط) قام المستخدم بالنقر مرتين بإصبعه أثناء تركيز VoiceOver على المكون أو ضمنه.
 +
* <code>'escape'</code>: (في iOS فقط)  قام المستخدم بإيماءة إلغاء بإصبعين (يسار، يمين، يسار) أثناء تركيز VoiceOver على المكون أو ضمنه.
 +
* <code>'activate'</code>: تفعيل المكون، يجب أن يؤدي هذا إلى تنفيذ نفس الإجراء عندما ينقر المستخدم على مكون ما أو يلمسه عندما لا يستخدم التقنية المساعدة، والذي ينشأ عندما ينقر مستخدم قارئ الشاشة مرتين على المكون.
 +
* <code>'increment'</code>: تكبير مكون قابل للتعديل، في iOS ينشئ VoiceOver هذا الإجراء عندما يكون للمكون وظيفة <code>'adjustable'</code> وقام المستخدم بالتركيز عليه والنقر لأعلى، وفي Android ينشئ TalkBack هذا الإجراء عندما يضع المستخدم تركيز سهولة الوصول على المكون ويضغط على زر رفع الصوت.
 +
* <code>'decrement'</code>: تصغير مكون قابل للتعديل، في iOS ينشئ VoiceOver هذا الإجراء عندما يكون للمكون وظيفة <code>'adjustable'</code> وقام المستخدم بالتركيز عليه والنقر لأسفل، وفي Android ينشئ TalkBack هذا الإجراء عندما يضع المستخدم تركيز سهولة الوصول على المكون ويضغط على زر خفض الصوت.
 +
* <code>'longpress'</code> (في Android فقط) ينشَأ هذا الإجراء عندما يركز المستخدم سهولة الوصول على المكون وينقر مرتين ويبقي إصبعًا واحدًا على الشاشة، يجب أن يؤدي هذا إلى تنفيذ نفس الإجراء عندما يستمر المستخدم بالضغط بإصبع واحد على المكون عندما لا يستخدم التقنية المساعدة.
 +
 
 +
الحقل <code>label</code> اختياري في الإجراءات القياسية، ولا يستخدم عادة في التقنية المساعدة، أما بالنسبة للإجراءات المخصصة فهو سلسلة نصية محلية تحوي وصف الإجراء الذي سيقدم للمستخدم.
 +
 
 +
يجب أن ينفذ المكون الدالة <code>onAccessibilityAction</code> لمعالجة طلبات الإجراءات، المعامل الوحيد لهذه الدالة هو حدث يحوي اسم الإجراء الذي سينفذ، يوضح المثال التالي من RNTester كيفية إنشاء مكون يعرّف عدة إجراءات مخصصة ويعالجها: <syntaxhighlight lang="javascript">
 +
<View
 +
  accessible={true}
 +
   accessibilityActions={[
 +
    { name: 'cut', label: 'cut' },
 +
    { name: 'copy', label: 'copy' },
 +
    { name: 'paste', label: 'paste' }
 +
  ]}
 +
   onAccessibilityAction={(event) => {
 +
     switch (event.nativeEvent.actionName) {
 +
      case 'cut':
 +
        Alert.alert('Alert', 'cut action success');
 +
        break;
 +
      case 'copy':
 +
        Alert.alert('Alert', 'copy action success');
 +
        break;
 +
      case 'paste':
 +
        Alert.alert('Alert', 'paste action success');
 +
        break;
 +
    }
 +
   }}
 +
/>
 
</syntaxhighlight>
 
</syntaxhighlight>
في المثال أعلاه، سيُعلَن عن المُكوِّن ‎<code>TouchableWithoutFeedback</code>‎ على أنّه زرّ أصيل فيTalkBack.
 
====‎<code>accessibilityLiveRegion</code>‎ (في Android فقط)====
 
عندما تتغير المكونات ديناميكيًا، فسنرغب بتنبيه المستخدم عبر TalkBack. هذا مُمكن من خلال الخاصية ‎<code>accessibilityLiveRegion</code>‎. يُمكن تعيين القيم ‎<code>assertive</code>‎، ‎<code>polite</code>‎، ‎<code>none</code>‎ لها:
 
  
* ‎<code>none</code>‎: لا يجب على خدمات سهولة الوصول الإعلان عن تغيُّرات هذا العرض.
+
==التحقق مما إذا كان قارئ شاشةٍ مفعلًا أو لا==
* ‎<code>polite</code>‎: يجب على خدمات سهولة الوصول الإعلانُ عن تغيُّرات هذا العرض.
+
تسمح لك الواجهة ‎<code>AccessibilityInfo</code>‎ البرمجيّة بتحديد ما إذا كان قارئ الشاشة نشطًا أو لا. انظر توثيق ‎<code>[[ReactNative/accessibilityinfo|AccessibilityInfo]]</code>‎ للاستزادة.
* ‎<code>assertive</code>‎: يجب على خدمات سهولة الوصول الإعلانُ فورًا عن تغيُّرات هذا العرض مُقاطعةً بذلك النّص المُتحدَّث حاليًّا.
+
 
 +
==إرسال أحداث سهولة الوصول (في Android فقط)==
 +
من المُفيد أحيانًا إطلاق حدث سهولة وصولٍ (accessibility event) على مكونٍ من مكوّنات عرض المستخدم (عند ظهور عرض مُخصّص على الشاشة أو عند تحديد زر اختيار مخصّص مثلًا). توفّر وحدة  <code>UIManager</code> الأصيلة التّابع ‎<code>sendAccessibilityEvent</code>‎ لهذا الغرض. ويأخذ هذا التّابع معاملين: وسم العرض (view tag) ونوع الحدث. أنماط الأحداث المدعومة هي <code>typeWindowStateChanged</code>و <code>typeViewFocused</code> و <code>typeViewClicked</code>
 
<syntaxhighlight lang="javascript">
 
<syntaxhighlight lang="javascript">
<TouchableWithoutFeedback onPress={this._addOne}>
+
import {
   <View style={styles.embedded}>
+
   Platform,
    <Text>Click me</Text>
+
  UIManager,
   </View>
+
   findNodeHandle
</TouchableWithoutFeedback>
+
} from 'react-native';
<Text accessibilityLiveRegion="polite">
 
  Clicked {this.state.count} times
 
</Text>
 
</syntaxhighlight>
 
في المثال أعلاه، يُغيّر التّابع ‎<code>_addOne</code>‎ متغيّر الحالة ‎<code>state.count</code>‎. سيقرأ TalkBack النصّ الموجود في عرض ‎<code>Text</code>‎ بمجرد نقر المستخدم على المكوّن ‎<code>TouchableWithoutFeedback</code>‎، وذلك لوجود الخاصية ‎<code>accessibilityLiveRegion="polite"</code>‎ عليه.
 
  
====‎<code>importantForAccessibility</code>‎ (في Android فقط)====
+
if (Platform.OS === 'android') {
في حالة تراكب مكونَين من مكوّنات واجهة مستخدم يمتلكان نفس المكوّن الأب، يمكن أن يكون تركيز سهولة الوصول الافتراضي سلوكًا غير متوقع. ستحلّ خاصية ‎<code>importantForAccessibility</code>‎ هذه المشكلة عبر التحكم في ما إذا كان عرضٌ قادرًا على إطلاق أحداث سهولة الوصول وما إذا كانت هذه الأحداث ستُرسَل إلى خدمات سهولة الوصول. يمكن تعيين الخاصيّة إلى القيمة ‎<code>auto</code>‎، أو ‎<code>yes</code>‎، أو ‎<code>no</code>‎، أو ‎<code>no-hide-descendants</code>‎ (تُرغِم هذه القيمةُ الأخيرة خدماتِ سهولة الوصول على تجاهل المكوّن وكل أطفاله).
+
   UIManager.sendAccessibilityEvent(
<syntaxhighlight lang="javascript">
+
     findNodeHandle(this),
<View style={styles.container}>
+
     UIManager.AccessibilityEventTypes.typeViewFocused
   <View style={{position: 'absolute', left: 10, top: 10, right: 10, height: 100,
+
   );
     backgroundColor: 'green'}} importantForAccessibility=”yes”>
+
}
     <Text> First layout </Text>
 
   </View>
 
  <View style={{position: 'absolute', left: 10, top: 10, right: 10, height: 100,
 
    backgroundColor: 'yellow'}} importantForAccessibility=”no-hide-descendants”>
 
    <Text> Second layout </Text>
 
  </View>
 
</View>
 
 
</syntaxhighlight>
 
</syntaxhighlight>
في المثال أعلاه، لن يظهر التخطيط الأصفر وأحفاده أبدًا لأداة TalkBack ولجميعِ خدمات سهولة الوصول الأخرى. لذلك يمكننا بسهولة استخدام طرق العرض المتداخلة ذات نفس المكوّن الأب دون إرباك أداة TalkBack.
 
  
===التحقق مما إذا كان قارئ شاشةٍ مفعلا أو لا===
+
== اختبار دعم القارئ TalkBack (في Android فقط) ==
تسمح لك واجهة ‎<code>AccessibilityInfo</code>‎ البرمجيّة بتحديد ما إذا كان قارئ الشاشة نشطًا أو لا. انظر توثيق ‎<code>AccessibilityInfo</code>‎ للاستزادة.
+
لتفعيل أداة TalkBack انتقل إلى تطبيق الإعدادات على جهاز Android الخاص بك أو محاكيه، انقر على سهولة الوصول (Accessibility)،  ثم على القارئ TalkBack.بدّل المفتاح "Use service" لتفعيله أو إلغاء تفعيله.
  
===إرسال أحداث سهولة الوصول (في Android فقط)===
+
ملاحظة: لا يحوي محاكي Android الأداة TalkBack بشكل افتراضي، لتحميله اتبع الخطوات:
من المُفيد أحيانًا إطلاق حدث سهولة وصولٍ (accessibility event) على مكونٍ من مكوّنات واجهة المستخدم (عند ظهور عرض مُخصّص على الشاشة أو عند تحديد زر اختيار مخصّص مثلًا). توفّر وحدة  <code>UIManager</code> الأصيلة التّابع ‎<code>sendAccessibilityEvent</code>‎ لهذا الغرض.  ويأخذ هذا التّابع معاملين: وسم العرض (view tag) ونوع الحدث.
 
<syntaxhighlight lang="javascript">
 
  
 +
* حمل ملف TalkBack من https://google-talkback.en.uptodown.com/android.
 +
* اسحب الملف .apk المحمل إلى المحاكي.
  
import { UIManager, findNodeHandle } from 'react-native';
+
يمكن استخدام اختصار مفتاح الصوت لتعطيل أو تفعيل الأداة TalkBack، لتشغيل هذا الاختصار اذهب إلى تطبيق الإعدادات ثم اختر سهولة الوصول (Accessibility)، ثم شغل اختصار مفتاح الصوت (Volume key shortcut).
  
_onPress: function() {
+
لاستخدام اختصار مفتاح الصوت اضغط على مفتاحي الصوت معًا لمدة 3 ثوانٍ لبدء أداة سهولة الوصول.
  const radioButton = this.state.radioButton === 'radiobutton_checked' ?
 
    'radiobutton_unchecked' : 'radiobutton_checked'
 
  
  this.setState({
+
يمكنك تعطيل أو تفعيل الأداة TalkBack باستخدام سطر الأوامر بالشكل التالي:<syntaxhighlight lang="javascript">
    radioButton: radioButton
+
# disable
  });
+
adb shell settings put secure enabled_accessibility_services com.android.talkback/com.google.android.marvin.talkback.TalkBackService
 
 
  if (radioButton === 'radiobutton_checked') {
 
    UIManager.sendAccessibilityEvent(
 
      findNodeHandle(this),
 
      UIManager.AccessibilityEventTypes.typeViewClicked);
 
  }
 
}
 
  
<CustomRadioButton
+
# enable
  accessibilityComponentType={this.state.radioButton}
+
adb shell settings put secure enabled_accessibility_services com.google.android.marvin.talkback/com.google.android.marvin.talkback.TalkBackService
  onPress={this._onPress}/>
 
 
</syntaxhighlight>
 
</syntaxhighlight>
أنشأنا في المثال أعلاه زر انتقاءٍ (radio button) مخصصٍ أصبح يسلك سلوك أزرار الانتقاء الأصيلة. بعبارة أدقّ، أصبَحت أداة TalkBack الآن تُعلن بشكل صحيح عن التغييرات الحاصلة في تحديد زر الانتقاء.
 
  
 
==اختبار دعم VoiceOver (في iOS فقط)==
 
==اختبار دعم VoiceOver (في iOS فقط)==
سطر 207: سطر 309:
 
* [https://facebook.github.io/react-native/docs/accessibility صفحة Accessibility في توثيق React Native الرسمي.]
 
* [https://facebook.github.io/react-native/docs/accessibility صفحة Accessibility في توثيق React Native الرسمي.]
 
[[تصنيف:ReactNative]]
 
[[تصنيف:ReactNative]]
 +
[[تصنيف:React Native Docs]]

المراجعة الحالية بتاريخ 13:44، 9 أكتوبر 2021

يوفّر كل من نظامي التشغيل iOS وAndroid عروض برمجيّة لجعل التطبيقات متاحةً للأشخاص ذوي الإعاقات. إضافةً إلى أنّ النظامين كليهما يوفّران تقنيات مساعدة (assistive technologies)، مثل قارئَي الشّاشة VoiceOver (في iOS) وتقنية TalkBack (في Android) لضِعاف البصر. وبالمثل، يحتوي إطار React Native على عروض برمجيّة مُصمّمة لتزويد المطورين بأدواتٍ تُساعد على تسهيل استعمال التطبيقات وشمل كل المستخدمين بغض النظر عن أي مشاكل تعيق استعمالهم للتطبيق. لاحظ أن نظامي iOS و Android يختلفان اختلافًا طفيفًا في طريقة العمل، وبالتالي فقد تختلف طريقة العمل كذلك في React Native حسب المنصّة.

ملاحظة: كلمة شمولية وسهولة وصول هما مصطلحان مترادفان يشيران إلى المصطلح الأجنبي Accessibility.

خاصيات سهولة الوصول

accessible‎ (في iOS وAndroid)

عندما تكون قيمتُها القيمةَ ‎true‎، فذلك يشير إلى أنّ الواجهة (view) هي عنصرُ يملك ميزات سهولة وصول. وعندها سيُجمّع أبناءه في مكونٍ واحد قابل للتحديد. افتراضيًّا، يمكن الوصول إلى جميع العناصر القابلة للمس (touchable elements).

على Android، ستُترجَم خاصيّة ‎accessible={true}‎ على الواجهة ‎View‎ إلى الخاصيّة الأصيلة ‎focusable={true}‎.

<View accessible={true}>
  <Text>text one</Text>
  <Text>text two</Text>
</View>

في المثال أعلاه، لا يمكننا الحصول على تركيزِ سهل الوصول بشكل منفصلٍ لكلّ من "text one" و "text two". ونحصل بدلًا من ذلك على تركيزٍ على واجهة أبٍ تحمل الخاصية ‎accessible‎‎.

accessibilityLabel

عندما تعلَّم واجهة على أنها عنصرُ سهل الوصول، فسيُفيد تعيين خاصيّة ‎accessibilityLabel‎ لتُوفِّر تسميّةً للواجهة، بحيث يعرف الأشخاص الذين يستخدمون القارئ VoiceOver العنصر الذي حدّدوه. إذ سيقرأ القارئ VoiceOver هذه السلسلة النّصيّة عندما يحدِّد المستخدم العنصر ذا الصّلة.

لاستخدام هذه الميّزة، عيّن الخاصية ‎accessibilityLabel‎ إلى سلسلةٍ نصيّةٍ مخصّصة على مكوّن ‎View‎، أو ‎Text‎، أو ‎أي مكوّن قابلٍ للمس:

<TouchableOpacity
  accessible={true}
  accessibilityLabel="Tap me!"
  onPress={onPress}>
  <View style={styles.button}>
    <Text style={styles.buttonText}>Press me!</Text>
  </View>
</TouchableOpacity>

في المثال أعلاه، ستكون القيمةُ الافتراضيّةُ لخاصيّة ‎accessibilityLabel‎ على المكوّن TouchableOpacity القيمةَ ‎"Press me!"‎. تُنشأ القيمةُ عبر تجميع جميع نصوص ‎Text‎ الأبناء مفصولة بمسافات.

accessibilityHint

يساعد تلميح سهولة الوصول (accessibility hint) المستخدمينَ على فهم ما سيحدث عند القيام بشيءٍ ما على عنصرٍ عندما لا تكون هذه النتيجة واضحةً من تسميّة سهولة الوصول (accessibility label).

لاستخدام هذه الميّزة، عيّن الخاصية ‎accessibilityHint‎ إلى سلسلةٍ نصيّةٍ مخصّصة على مكوّن ‎View‎، أو ‎Text‎، أو ‎أي مكوّن قابلٍ للمس:

<TouchableOpacity
  accessible={true}
  accessibilityLabel="رجوع"
  accessibilityHint="الانتقال إلى الشّاشة السّابقة"
  onPress={onPress}>
  <View style={styles.button}>
    <Text style={styles.buttonText}>Back</Text>
  </View>
</TouchableOpacity>

سلوك المثال أعلاه في منصّة iOS: سيقرأ القارئ VoiceOver التلميح بعد قراءة التسمية إذا كان المستخدم قد فعَّل التلميحات في إعدادات القارئ VoiceOver الخاصة بالجهاز. اقرأ المزيد حول ‎ accessibilityHint‎ على توثيق مطوري iOS.

سلوك المثال أعلاه في منصّة Android: سيقرأ القارئ Talkback التلميح بعد قراءة التسمية. لا يمكن في الوقت الحالي تعطيل التلميحات على Android.

accessibilityIgnoresInvertColors‎ (في iOS فقط)

عكس ألوان الشاشة هي ميزةُ سهولةِ وصولٍ تجعل شاشات iPhone و iPad مريحةً لعيني الأشخاص ذوي حساسيةٍ تجاه السطوع، وسهلَة التمييز للأشخاص الذين يعانون من عمى الألوان وللأشخاص الذين يعانون من ضعف في الرؤية. لكن أحيانًا تحتاج إلى عرض عروضٍ مثل الصور دون عكس ألوانها. في هذه الحالة، يمكنك تعيين هذه الخاصيّة لتأخذ القيمةَ false كي لا تُعكَس ألوان هذه العروض المحددة.

accessibilityLiveRegion (في Android فقط)

نريد أن ينبه القارئ Talkback المستخدم النهائي عندما تتغير المكونات بشكلٍ ديناميكيّ، وهذا ممكن باستخدام الخاصية accessibilityLiveRegion. والتي تأخذ إحدى القيم التالية:

  • none: لا تعلن خدمات سهولة الوصول عن التغييرات لهذه الواجهة.
  • polite: يجب أن تعلن خدمات سهولة الوصول عن التغييرات لهذه الواجهة.
  • assertive: يجب أن تقاطع خدمات سهولة الوصول الكلام الجاري للإعلان فورًا عن التغييرات التي تطرأ على هذه الواجهة.
<TouchableWithoutFeedback onPress={addOne}>
  <View style={styles.embedded}>
    <Text>Click me</Text>
  </View>
</TouchableWithoutFeedback>
<Text accessibilityLiveRegion="polite">
  Clicked {count} times
</Text>

‎في المثال أعلاه تغير الدالة addOne متحول الحالة countمباشرة عندما يضغط المستخدم TouchableWithoutFeedback، يقرأ القارئ TalkBack النص في الواجهة النصية Text لأن الخاصية accessibilityLiveRegion تأخذ القيمة polite.

accessibilityRole

‎تحدد هذه الخاصية الغرض من المكون لكي يتعرف عليه المستخدم للتكنولوجيا المساعدة. وتأخذ إحدى القيم التالية:

  • ‎adjustable: تستخدم عندما يكون العنصر قابلًا للتعديل (كشريط تمرير slider).
  • alert: يستخدم عندما يحتوي العنصر على نص مهم ليقدَّم للمستخدم.
  • ‎button‎: تجب معاملة العنصر كَزِرٍّ.
  • checkbox: تستخدم عندما يكون العنصر مربع اختيار يمكن تحديده أو إلغاء اختياره أو وجود حالة اختيار مختلطة.
  • combobox: يستخدم عندما يمثل العنصر مربع خيارات متعددة، مما يسمح للمستخدم بالاختيار من بين عدة خيارات.
  • ‎header‎: تستخدم عندما يعمل العنصر كعنوانٍ لقسم من أقسام المحتوى (كعنوان شريط التنقل مثلًا).
  • ‎image‎: تستخدم عندما يجب التعامل مع العنصر كصورةٍ. يمكن جمعها مع زر أو رابط مثلًا.
  • ‎imagebutton‎: تستخدم عندما يجب التعامل مع العنصر على أنه زر، وهوَ صورة كذلك.
  • ‎keyboardkey‎: تستخدم عندما يعمل العنصر كمفتاح لوحة مفاتيحٍ.
  • ‎link‎: تستخدم عندما يجب معاملة العنصر كَرابطٍ.
  • menu: يُستخدم عندما يكون المكون عبارة عن قائمة اختيارات.
  • menubar: تُستخدم عندما يكون العنصر عبارة عن حاوية قوائم متعددة.
  • menuitem: تستخدم لتمثيل عنصر داخل قائمة.
  • none‎: لا دور للعنصر.
  • progressbar: يستخدم لتمثيل مكون يشير إلى تقدم المهمة.
  • radio: تستخدم لتمثيل زر اختيار.
  • radiogroup: تستخدم لتمثيل مجموعة من أزرار الاختيار.
  • scrollbar: تستخدم لتمثيل شريط التمرير.
  • search: يُستخدم عندما يجب معاملة عنصر حقل النص كحقل بحث أيضًا.
  • spinbutton: يستخدم لتمثيل زر يفتح قائمة خيارات.
  • ‎summary‎: يمكن استخدام العنصر لتوفير ملخص سريع للظروف الحالية في التطبيق عند تشغيل التطبيق.
  • switch: تستخدم لتمثيل مفتاح يمكن تشغيله وإيقافه.
  • tab: تستخدم لتمثيل علامة تبويب.
  • tablist: تستخدم لتمثيل قائمة من علامات التبويب.
  • ‎text‎: يجب التعامل مع العنصر كنص ثابت لا يمكن تغييره.
  • timer: تستخدم لتمثيل مؤقت.
  • toolbar: يستخدم لتمثيل شريط الأدوات (حاوية أزرار إجراءات أو مكونات).

accessibilityState

تصف الحالة الحالية للمكون لمستخدم التكنولوجيا المساعدة. وهي كائن يحوي الحقول التالية:

الاسم الوصف النمط مطلوب
disabled يشير إلى ما إذا كان العنصر معطلاً أم لا. قيمة منطقية لا
selected يشير إلى ما إذا كان العنصر القابل للتحديد محددًا حاليًا أم لا. قيمة منطقية لا
checked يشير إلى حالة العنصر القابل للفحص. يمكن أن يأخذ هذا الحقل قيمة منطقية أو سلسلة "مختلطة" لتمثيل مربعات اختيار مختلطة. قيمة منطقية (boolean) لا
busy يحدد فيما إذا كان العنصر مشغولًا حاليًا أو لم. قيمة منطقية (boolean) أو مختلطة لا
expanded يشير إلى ما إذا كان العنصر القابل للتوسع موسعًا حاليّا أو مطويًا. قيمة منطقية (boolean) لا

لاستخدام هذه الميّزة، عيّن الخاصية ‎accessibilityState‎ إلى كائن بتعريف محدد.

accessibilityValue

تمثل قيمة المكون الحالية، ويمكن أن تكون وصفًا نصيًّا لقيمته، أو معلومات المجالات في المكونات التي تعتمد المجالات كأشرطة التمرير أو التقدم (كالقيمة الحالية والحدود العليا والدنيا). وهي كائن يحوي الحقول التالية:

الاسم الوصف النمط مطلوب
min قيمة الحد الأدنى لمجال المكون عدد (integer) فقط عندما تحدد now
max قيمة الحد الأعلى لمجال المكون عدد (integer) فقط عندما تحدد now
now القيمة الحالية لمجال المكون عدد (integer) لا
text وصف نصي لمجال المكون، وإضا تم تعيينه فسيتجاوز قيم min و max و now سلسلة نصية (string) لا

‎‎accessibilityViewIsModal‎ (في iOS فقط)

قيمة منطقيةٌ تشير إلى ما إذا كان يجب على القارئ VoiceOver تجاهل العناصر الموجودة في العروض الشّقيقة للمُستقبِل.

على سبيل المثال، في نافذةٍ تحتوي على واجهتين شقيقين ‎A‎ و‎B‎، سيؤدي تعيين ‎accessibilityViewIsModal‎ إلى القيمة ‎true‎ على الواجهة ‎B‎ إلى تجاهل VoiceOver لعناصر الواجهة ‎A‎. من ناحية أخرى، إذا كانت الواجهة ‎B‎ تحتوي على واجهة فرعية ‎C‎ وقمت بتعيين الخاصيّة ‎accessibilityViewIsModal‎ إلى القيمة ‎true‎ على الواجهة C‎، فلن يتجاهل VoiceOver العناصر الموجودة في الواجهة ‎A‎.

accessibilityElementsHidden‎ (في iOS فقط)

قيمةٌ منطقيةٌ تشير إلى ما إذا كانت عناصر سهولة الوصول الموجودة داخل عنصرُ سهولة الوصول الحاليّ مخفيةً أو لا.

على سبيل المثال، في نافذةٍ تحتوي على واجهتين شقيقين ‎A‎ و‎B‎، سيؤدي تعيين ‎accessibilityElementsHidden‎ إلى القيمة ‎true‎ على الواجهة ‎B‎ إلى تجاهل VoiceOver للعناصر في الواجهة ‎B‎. وهي مُشابهة للخاصيّة ‎importantForAccessibility="no-hide-descendants"‎ في Android.

importantForAccessibility‎ (في Android فقط)

في حالة تراكب مكونَين من مكوّنات عرض مستخدم يمتلكان نفس المكوّن الأب، يمكن أن يكون تركيز سهولة الوصول الافتراضي سلوكًا غير متوقع. ستحلّ خاصية ‎importantForAccessibility‎ هذه المشكلة عبر التحكم في ما إذا كان عرضٌ قادرًا على إطلاق أحداث سهولة الوصول وما إذا كانت هذه الأحداث ستُرسَل إلى خدمات سهولة الوصول. يمكن تعيين الخاصيّة إلى القيمة ‎auto‎، أو ‎yes‎، أو ‎no‎، أو ‎no-hide-descendants‎ (تُرغِم هذه القيمةُ الأخيرة خدماتِ سهولة الوصول على تجاهل المكوّن وكل أبنائه).

<View style={styles.container}>
  <View
    style={[styles.layout, { backgroundColor: 'green' }]}
    importantForAccessibility="yes">
    <Text>First layout</Text>
  </View>
  <View
    style={[styles.layout, { backgroundColor: 'yellow' }]}
    importantForAccessibility="no-hide-descendants">
    <Text>Second layout</Text>
  </View>
</View>

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

onAccessibilityEscape (في iOS فقط)

استخدم هذه الخاصية لتعيين دالة مخصصة لاستدعائها عندما تنفَذ المستخدم الإيماءة "escape"، وهي إيماءة بإصبعين من الشكل Z ، يجب أن تعود هذه الدالة إلى الوراء بشكلٍ هرمي في واجهة المستخدم، وهذا يعني التحرك للأعلى أو للخلف في التسلسل الهرمي للتنقل أو رفض واجهة مستخدم مشروطة. إذا لم يحتو العنصر المحدد على دالة onAccessibilityEscape فسيحاول النظام اجتياز التسلسل الهرمي للعرض حتى يحصل على عرض يعمل أو سيشير إلى أنه غير قادر على إيجاده.

onAccessibilityTap

استخدم هذه الخاصية لتعيين دالّةٍ مخصصة لاستدعائها عندما يُنشِّط المُستخدم عنصرَ سهولةِ وصولٍ عبر النقر المزدوج (double tapping) عليه أثناء تحديده.

onMagicTap‎ (في iOS فقط)

استخدم هذه الخاصية لتعيين دالّةٍ مخصصة لاستدعائها عندما يؤدّي المُستخدم إيماءة نقرٍ سحريّ (magic tap) وهيَ نقرٌ مزدوجٌ بإصبعين اثنين. يجب أن تُنجِز دالّةُ النقر السحري أنسَبَ إجراءٍ يمكن للمستخدم إنجازه على المكوّن. في تطبيق الهاتف على جهاز iPhone، يُجيب النّقر السّحري على مكالمةٍ هاتفية أو يُنهي الاتصال الحالي. إذا لم يحتوِ العنصرُ المحدَّد على دالّة onMagicTap، فسينتقل النظام إلى أعلى تسلسل العروض الهرمي (view hierarchy) إلى أن يصِل إلى عرضٍ يحتوي على هذه الدّالة.

إجراءات سهولة الوصول

تساعد إجراءات سهولة الوصول التقنية المساعدة على استدعاء إجراءات المكون برمجيًا، ولدعم الإجراءات يجب أن يقوم المكون بأمرين:

  • تعريف الإجراءات التي يدعمها في الخاصية accessibilityActions.
  • تنفيذ الدالة onAccessibilityAction للتعامل مع طلبات الإجراء.

يجب أن تحوي الخاصية accessibilityActions قائمة من أغراض الإجراءات، يحوي كل غرض منها الحقول التالية:

الاسم النمط مطلوب
name سلسلة نصية (string) نعم
label سلسلة نصية (string) لا

يمكن أن تكون الإجراءات قياسية، كالضغط على زر أو ضبط شريط تمرير، أو إجراءات مخصصة لمكون محدّد كحذف رسالة بريد إلكتروني، والحقل name مطلوب لكلا النوعين، لكن الحقل label اختياري في الإجراءات القياسية.

عند إضافة الدعم للإجراءات القياسية يجب أن تكون للحقل name إحدى القيم التالية:

  • 'magicTap' : (في iOS فقط) قام المستخدم بالنقر مرتين بإصبعه أثناء تركيز VoiceOver على المكون أو ضمنه.
  • 'escape': (في iOS فقط) قام المستخدم بإيماءة إلغاء بإصبعين (يسار، يمين، يسار) أثناء تركيز VoiceOver على المكون أو ضمنه.
  • 'activate': تفعيل المكون، يجب أن يؤدي هذا إلى تنفيذ نفس الإجراء عندما ينقر المستخدم على مكون ما أو يلمسه عندما لا يستخدم التقنية المساعدة، والذي ينشأ عندما ينقر مستخدم قارئ الشاشة مرتين على المكون.
  • 'increment': تكبير مكون قابل للتعديل، في iOS ينشئ VoiceOver هذا الإجراء عندما يكون للمكون وظيفة 'adjustable' وقام المستخدم بالتركيز عليه والنقر لأعلى، وفي Android ينشئ TalkBack هذا الإجراء عندما يضع المستخدم تركيز سهولة الوصول على المكون ويضغط على زر رفع الصوت.
  • 'decrement': تصغير مكون قابل للتعديل، في iOS ينشئ VoiceOver هذا الإجراء عندما يكون للمكون وظيفة 'adjustable' وقام المستخدم بالتركيز عليه والنقر لأسفل، وفي Android ينشئ TalkBack هذا الإجراء عندما يضع المستخدم تركيز سهولة الوصول على المكون ويضغط على زر خفض الصوت.
  • 'longpress' (في Android فقط) ينشَأ هذا الإجراء عندما يركز المستخدم سهولة الوصول على المكون وينقر مرتين ويبقي إصبعًا واحدًا على الشاشة، يجب أن يؤدي هذا إلى تنفيذ نفس الإجراء عندما يستمر المستخدم بالضغط بإصبع واحد على المكون عندما لا يستخدم التقنية المساعدة.

الحقل label اختياري في الإجراءات القياسية، ولا يستخدم عادة في التقنية المساعدة، أما بالنسبة للإجراءات المخصصة فهو سلسلة نصية محلية تحوي وصف الإجراء الذي سيقدم للمستخدم.

يجب أن ينفذ المكون الدالة onAccessibilityAction لمعالجة طلبات الإجراءات، المعامل الوحيد لهذه الدالة هو حدث يحوي اسم الإجراء الذي سينفذ، يوضح المثال التالي من RNTester كيفية إنشاء مكون يعرّف عدة إجراءات مخصصة ويعالجها:

<View
  accessible={true}
  accessibilityActions={[
    { name: 'cut', label: 'cut' },
    { name: 'copy', label: 'copy' },
    { name: 'paste', label: 'paste' }
  ]}
  onAccessibilityAction={(event) => {
    switch (event.nativeEvent.actionName) {
      case 'cut':
        Alert.alert('Alert', 'cut action success');
        break;
      case 'copy':
        Alert.alert('Alert', 'copy action success');
        break;
      case 'paste':
        Alert.alert('Alert', 'paste action success');
        break;
    }
  }}
/>

التحقق مما إذا كان قارئ شاشةٍ مفعلًا أو لا

تسمح لك الواجهة ‎AccessibilityInfo‎ البرمجيّة بتحديد ما إذا كان قارئ الشاشة نشطًا أو لا. انظر توثيق ‎AccessibilityInfo‎ للاستزادة.

إرسال أحداث سهولة الوصول (في Android فقط)

من المُفيد أحيانًا إطلاق حدث سهولة وصولٍ (accessibility event) على مكونٍ من مكوّنات عرض المستخدم (عند ظهور عرض مُخصّص على الشاشة أو عند تحديد زر اختيار مخصّص مثلًا). توفّر وحدة UIManager الأصيلة التّابع ‎sendAccessibilityEvent‎ لهذا الغرض. ويأخذ هذا التّابع معاملين: وسم العرض (view tag) ونوع الحدث. أنماط الأحداث المدعومة هي typeWindowStateChangedو typeViewFocused و typeViewClicked

import {
  Platform,
  UIManager,
  findNodeHandle
} from 'react-native';

if (Platform.OS === 'android') {
  UIManager.sendAccessibilityEvent(
    findNodeHandle(this),
    UIManager.AccessibilityEventTypes.typeViewFocused
  );
}

اختبار دعم القارئ TalkBack (في Android فقط)

لتفعيل أداة TalkBack انتقل إلى تطبيق الإعدادات على جهاز Android الخاص بك أو محاكيه، انقر على سهولة الوصول (Accessibility)، ثم على القارئ TalkBack.بدّل المفتاح "Use service" لتفعيله أو إلغاء تفعيله.

ملاحظة: لا يحوي محاكي Android الأداة TalkBack بشكل افتراضي، لتحميله اتبع الخطوات:

يمكن استخدام اختصار مفتاح الصوت لتعطيل أو تفعيل الأداة TalkBack، لتشغيل هذا الاختصار اذهب إلى تطبيق الإعدادات ثم اختر سهولة الوصول (Accessibility)، ثم شغل اختصار مفتاح الصوت (Volume key shortcut).

لاستخدام اختصار مفتاح الصوت اضغط على مفتاحي الصوت معًا لمدة 3 ثوانٍ لبدء أداة سهولة الوصول.

يمكنك تعطيل أو تفعيل الأداة TalkBack باستخدام سطر الأوامر بالشكل التالي:

# disable
adb shell settings put secure enabled_accessibility_services com.android.talkback/com.google.android.marvin.talkback.TalkBackService

# enable
adb shell settings put secure enabled_accessibility_services com.google.android.marvin.talkback/com.google.android.marvin.talkback.TalkBackService

اختبار دعم VoiceOver (في iOS فقط)

لتفعيل أداة VoiceOver، انتقل إلى تطبيق الإعدادات على جهاز iOS الخاص بك. انقر على قسم الإعدادات العامّة (General)، ثم سهولة الوصول (Accessibility). ستجد في هذا القسم العديد من الأدوات التي يستخدمها الأشخاص لجعل أجهزتهم أكثر قابلية للاستخدام، كالنصوص الأكثر ثخانةً (bolder text)، وزيادة التباين (contrast)، وأداة VoiceOver.

لتمكين VoiceOver، انقر على VoiceOver داخل خيار الرؤية (Vision) وبدّل المفتاح الذي يظهر في الأعلى.

يوجد خيار "اختصار سهولة الوصول (Accessibility Shortcut)" في الجزء السفلي من إعدادات سهولة الوصول. يمكنك استخدام هذا لتفعيل أو تعطيل أداة VoiceOver عن طريق النقر الثلاثي (النقر ثلاثة مرّات: triple click) على زر المنزل (Home button).

مصادر