ये दो अधिसूचनाएं विचारों पर गतिशील सामग्री के लिए हैं, और इन परिवर्तनों को स्क्रीनreader उपयोगकर्ताओं के लिए वॉयसओवर में संचारित करना है। इन दो अधिसूचनाओं के बीच थोड़ा अंतर है, उनके डिफ़ॉल्ट व्यवहार को छोड़कर, और स्क्रीनचेंज अधिसूचनाओं के लिए मूर्खतापूर्ण छोटी "बूप बीप"।
दोनों उदाहरणों में, तर्क
UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, arg);
एक स्ट्रिंग का प्रतिनिधित्व करता है बाहर पढ़ने के लिए, या स्क्रीन तत्व है, जो योग्यता के लिए अपना ध्यान केंद्रित परिवर्तन होगा पर एक। नाटकीय संदर्भ परिवर्तनों की स्थिति में, किसी ऐसे स्थान पर ध्यान देना महत्वपूर्ण है जो समझ में आता है, या घोषणा करता है कि ऐसे परिवर्तन हुए हैं। किसी भी दृष्टिकोण को पहुंच के दृष्टिकोण से स्वीकार्य है, हालांकि मैं उन दृष्टिकोणों को प्राथमिकता देता हूं जिनमें कम से कम परिवर्तन संभव हो। सरल लेआउट परिवर्तनों की स्थिति में, संदर्भ परिवर्तन की घोषणा करने के लिए यह लगभग हमेशा सर्वोत्तम होता है, और जहां यह था वहां फोकस छोड़ दें। हालांकि कभी-कभी, तत्व परिवर्तन जो संदर्भ परिवर्तन को छुपाता है, और फिर नई सामग्री को हाइलाइट करने के लिए वॉयसओवर को निर्देशित करना स्पष्ट रूप से आवश्यक है, क्योंकि इस मामले में डिफ़ॉल्ट व्यवहार अनिर्धारित है, या शायद निर्धारिती है, लेकिन एक ढांचे द्वारा निर्धारित किया गया है जो बिल्कुल कुछ नहीं जानता अपने ऐप के बारे में!
दो घटनाओं के बीच अंतर, यह देखते हुए कि वे दोनों एक ही काम करते हैं, उनके डिफ़ॉल्ट व्यवहार में है। यदि आप UIAccessibilityLayoutChangedNotification
पर शून्य प्रदान करते हैं तो ऐसा लगता है कि आपने कुछ भी नहीं किया है।यदि आप UIAccessibilityScreenChangedNotification
पर एक शून्य तर्क प्रदान करते हैं तो यह आपके दृश्य पदानुक्रम में पहले UIObject पर फ़ोकस भेजेगा जिसे अभिगम्यता के रूप में चिह्नित किया गया है, एक बार सभी दृश्य पदानुक्रम परिवर्तन और चित्र पूर्ण हो जाते हैं।
UIAccessibilityLayoutChangedNotification
UIAccessibilityLayoutChangedNotification
के लिए एक अच्छा उपयोग के मामले उदाहरण गतिशील रूपों के लिए है। आप उपयोगकर्ताओं को यह बताना चाहते हैं कि, फ़ॉर्म में किए गए निर्णयों के आधार पर, नए विकल्प उपलब्ध हैं। उदाहरण के लिए, यदि किसी रूप में आप चुनते हैं कि आप एक अनुभवी हैं, तो फॉर्म के अतिरिक्त क्षेत्र अधिक इनपुट प्रदान करने के लिए पॉप अप हो सकते हैं, लेकिन इन क्षेत्रों को उन अन्य उपयोगकर्ताओं के लिए छिपा दिया जा सकता है जिन्होंने उनकी परवाह नहीं की थी। तो अगर आप उपयोगकर्ता बातचीत के बाद इन तत्वों को फोकस बदलाव कर सकता है:
UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, firstNewFormElement);
कौन सा प्रदान की तत्व को फोकस शिफ्ट होता है और यह accessibilityLabel है की घोषणा।
या सिर्फ उनसे कहता हूं कि नए रूप तत्वों देखते हैं:
UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, @"Veterans form elements available");
कौन सा ध्यान केंद्रित कहाँ है छोड़ना होगा, लेकिन योग्यता की घोषणा करेंगे "दिग्गजों उपलब्ध तत्वों के रूप में"।
नोट: यह विशेष व्यवहार मेरे आईपैड (8.1.2) पर बग किया गया है।
या अंत में आप यह कर सकता है:
UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, nil);
जो बिल्कुल कुछ भी नहीं है :) करता है। गंभीरता से, मुझे यह भी नहीं लगता कि एक 11y फ्रेमवर्क बैकएंड परवाह है। कोड की यह विशेष पंक्ति एक पूर्ण अपशिष्ट है!
UIAccessibilityScreenChangedNotification
UIAccessibilityScreenChangedNotification
के लिए एक अच्छा उपयोग के मामले उदाहरण अनुकूलित है टैब्ड ब्राउज़िंग स्थितियों। जब आपकी नेविगेशन क्षेत्र के अपवाद के साथ पूरी स्क्रीन बदल जाती है। आप वॉयसओवर को यह जानना चाहते हैं कि अनिवार्य रूप से पूरी स्क्रीन बदल गई है, लेकिन पहले तत्व (आपका पहला टैब) पर ध्यान केंद्रित नहीं करना है, लेकिन पहले सामग्री तत्व पर ध्यान केंद्रित करना है।
UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, firstNonGlobalNavElement);
जो "बूप बीप" ध्वनि बजाएगा और फिर अपने वैश्विक नेविगेशन बार के नीचे फ़ोकस को स्थानांतरित करेगा। या फिर आप ऐसा कर सकता है:
UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, @"You're on a new tab");
कौन सा लोड करने के लिए नए टैब के लिए इंतजार करेंगे,, "बीप boop" ध्वनि चलाने की घोषणा वॉयसओवर में "आप एक नया टैब पर हैं", तो पहले को फोकस शिफ्ट स्क्रीन पर तत्व, फिर उस तत्व के लिए accessibilityLabel की घोषणा करें। (PHEW! यह बहुत है! यह स्क्रीन रीडर उपयोगकर्ताओं के लिए जारिंग है। इस परिदृश्य से बचें, जब तक कि बिल्कुल जरूरी न हो)।
और अंत में आप निश्चित रूप से यह कर सकते हैं:
UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, firstA11yElement);
दोनों जिनमें से, "बीप boop" ध्वनि खेलेंगे पहले करने के लिए योग्यता फोकस शिफ्ट:
UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil);
कौन सा के बराबर है स्क्रीन पर तत्व, और फिर इसे घोषित करें।
अंत में
एक टिप्पणी किसी में कैशिंग उल्लेख किया है, और मैं कभी कभी बातें A11y बैकएंड या के बारे में परवाह नहीं हो सकता है के बारे में मेरा उत्तर में टिप्पणी। हालांकि यह निश्चित रूप से संभव है कि कुछ बैकएंड जादू हो रहा है, मैं इन परिस्थितियों में से किसी एक पर विश्वास नहीं करता हूं, पिछला अंत बिल्कुल परवाह करता है। कारण मैं यह कहता हूं क्योंकि:
यदि आपने कभी भी UIAccessibilityContainer
प्रोटोकॉल का उपयोग किया है, तो आप देख सकते हैं कि आपके कंटेनर के विचार पूछे जाते हैं। कोई कैशिंग चल रहा है। यहां तक कि accessibilityElementCount
संपत्ति प्रत्येक बार पिंग हो जाती है वॉयसओवर आपके कंटेनर के भीतर एक नई पहुंच-योग्यता पर ध्यान केंद्रित करता है। फिर यह जांचने की प्रक्रिया के माध्यम से जाता है कि यह किस तत्व पर है, अगले तत्व के लिए पूछ रहा है, और इसी तरह। यह गतिशील स्थितियों को संभालने के लिए अपने मूल पर डिजाइन किया गया है। यदि आप बातचीत के बाद अपने कंटेनर में एक नया तत्व डालना चाहते थे, तो यह अभी भी इन सभी प्रश्नों के माध्यम से जाएगा और इसके बारे में ठीक होगा! इसके अलावा, यदि आप गतिशील संकेत और लेबल प्रदान करने के लिए UIAccessibility प्रोटोकॉल के गुणों को ओवरराइड करते हैं, तो आप यह भी देख सकते हैं कि इन कार्यों को हर बार बुलाया जाता है! इस प्रकार, मेरा मानना है कि A11y फ्रेमवर्क बैकएंड इन अधिसूचनाओं से पूरी तरह से शून्य जानकारी प्राप्त करता है। वॉयसओवर को केवल एक ही जानकारी की आवश्यकता है, यह वर्तमान में केंद्रितता अभिगम्यता तत्व है, और यह तत्व अभिगम्यता कंटेनर है। वॉइसओवर उपयोगकर्ताओं के लिए आपके ऐप को और अधिक उपयोग करने योग्य बनाने के लिए अधिसूचनाएं बस आपके लिए हैं।
कल्पना कीजिए कि अगर ऐसा नहीं होता है तो सफारी इन अधिसूचनाओं को कितनी बार पोस्ट करेगा !!!! :)
ये विशेष विवरण केवल फ्रेमवर्क के बैकएंड ज्ञान वाले किसी व्यक्ति द्वारा पुष्टि की जा सकती है, जो कोड के साथ काम करता है, और अनुमान के रूप में देखा जाना चाहिए। यह मामला हो सकता है कि यह अत्यधिक संस्करण/कार्यान्वयन निर्भर है। इन बिंदुओं पर चर्चा के लिए निश्चित रूप से खुला! इस पोस्ट का बाकी सुंदर कंक्रीट है।
आपके संदर्भ
इसमें से अधिकांश के लिए चौखटे के साथ काम करने का अनुभव से आता है, लेकिन यहां अगर आप आगे खुदाई करने के लिए इच्छा एक उपयोगी संदर्भ है।
https://developer.apple.com/documentation/uikit/accessibility/uiaccessibility
https://developer.apple.com/documentation/uikit/uiaccessibilitylayoutchangednotification
https://developer.apple.com/documentation/uikit/uiaccessibilityscreenchangednotification
और अंत में, मैं एक साथ रखा यह सब सामान का परीक्षण करने के मूर्खतापूर्ण थोड़ा एप्लिकेशन का एक खुला स्रोत रेपो।
https://github.com/chriscm2006/IOS-A11y-Api-Test
ने इसे खींचा। 'UIAccessibilityContainer' के खिलाफ परीक्षण करने का अच्छा विचार। – Justin
बिल्कुल सही। धन्यवाद। मैं @ जस्टिन से सहमत हूं। मैंने आपके द्वारा वर्णित बग को भी पुन: उत्पन्न किया और एक रडार दायर किया। –
ग्रेट उत्तर। कैशिंग के बारे में मैं केवल थोड़ा असहमत हूं। मुझे 100% यकीन है कि कहीं किसी प्रकार का कैश है। स्पष्टीकरण: मैंने 'UIAccessibilityContainer' के खिलाफ कुछ परीक्षण किए हैं और जैसा कि आप कहते हैं, फोकस चलने पर कंटेनर विधियों को बुलाया जाता है। लेकिन, जो कुछ भी कंटेनर प्रोटोकॉल विधियां लौटाती हैं, कुछ स्थितियों में, वॉयसओवर गलत मान पढ़ता रहता है यदि आप स्पष्ट रूप से लेआउट/स्क्रीन परिवर्तन अधिसूचना पोस्ट नहीं करते हैं। तो हुड के नीचे कैशिंग है।यह अकेले तत्वों को कैश नहीं कर सकता है, लेकिन यह कैश (तत्व, स्थिति) जोड़े या इन पंक्तियों के आसपास कुछ करता है। –