2015-01-06 8 views
30

मैं यह पता लगाने की कोशिश कर रहा हूं कि UIAccessibilityLayoutChangedNotification पोस्ट करते समय और UIAccessibilityScreenChangedNotification पोस्ट करते समय वास्तव में क्या होता है। जो मैं देख सकता हूं, मैं उन्हें हर जगह एक दूसरे के साथ उपयोग कर सकता हूं और कुछ भी अलग नहीं होता है।UIAccessibilityLayoutChangedNotification और UIAccessibilityScreenChangedNotification के बीच वास्तविक अंतर?

एप्पल प्रलेखन बस LayoutChanged उपयोग करने के लिए जब (उदाहरण के लिए) एक तत्व छिपा या दिखाया गया है, और ScreenChanged अगर पूरे स्क्रीन परिवर्तन का उपयोग करने के कहते हैं, लेकिन मैं वे क्या करते हैं जब मैं इस बारे में जानकारी प्रदान करने में रुचि हूँ, और एक या दूसरे का उपयोग करते समय मुझे अलग-अलग क्या देखना चाहिए।

क्या कोई दोनों के बीच कार्यान्वयन अंतरों का स्पष्ट स्पष्टीकरण दे सकता है?

उत्तर

36

ये दो अधिसूचनाएं विचारों पर गतिशील सामग्री के लिए हैं, और इन परिवर्तनों को स्क्रीन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

+3

ने इसे खींचा। 'UIAccessibilityContainer' के खिलाफ परीक्षण करने का अच्छा विचार। – Justin

+3

बिल्कुल सही। धन्यवाद। मैं @ जस्टिन से सहमत हूं। मैंने आपके द्वारा वर्णित बग को भी पुन: उत्पन्न किया और एक रडार दायर किया। –

+2

ग्रेट उत्तर। कैशिंग के बारे में मैं केवल थोड़ा असहमत हूं। मुझे 100% यकीन है कि कहीं किसी प्रकार का कैश है। स्पष्टीकरण: मैंने 'UIAccessibilityContainer' के खिलाफ कुछ परीक्षण किए हैं और जैसा कि आप कहते हैं, फोकस चलने पर कंटेनर विधियों को बुलाया जाता है। लेकिन, जो कुछ भी कंटेनर प्रोटोकॉल विधियां लौटाती हैं, कुछ स्थितियों में, वॉयसओवर गलत मान पढ़ता रहता है यदि आप स्पष्ट रूप से लेआउट/स्क्रीन परिवर्तन अधिसूचना पोस्ट नहीं करते हैं। तो हुड के नीचे कैशिंग है।यह अकेले तत्वों को कैश नहीं कर सकता है, लेकिन यह कैश (तत्व, स्थिति) जोड़े या इन पंक्तियों के आसपास कुछ करता है। –

-1

UIAccessibilityScreenChangedNotification यह इंगित करना है कि पूरी स्क्रीन बदल गई है और वॉयसओवर को रीसेट करना चाहिए।

UIAccessibilityLayoutChangedNotification यह इंगित करना है कि एक या अधिक, लेकिन सभी नहीं, स्क्रीन पर तत्व बदल गए हैं।

जब आपका यूआई नाटकीय रूप से बदलता है। आम तौर पर जब कोई उपयोगकर्ता आपके ऐप के एक अलग हिस्से में जाता है (एक अलग स्क्रीन पर नेविगेट करता है)। वॉयसओवर उपयोगकर्ता को टोन के साथ सूचित करता है, और यह अपने कैश को साफ़ करता है और पहुंच की डेटा के नए सेट से निपटने के लिए अन्य तैयारी करता है। यह वॉयसओवर को अलर्ट करता है कि स्क्रीन बदल गई है और स्क्रीन पर नए तत्व हो सकते हैं, इसलिए वॉयसओवर इसे एक्सेसिबिलिटी तत्वों की अनुक्रमणिका का पुनर्निर्माण करेगा।

UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil); 

अपने यूआई परिवर्तन का कुछ हिस्सा है, लेकिन उपयोगकर्ता जरूरी अपने अनुप्रयोग के एक बिल्कुल अलग हिस्से में नहीं कूद गया है। (उदाहरण: आईट्यून्स स्टोर ऐप में, किसी गीत के बगल में मूल्य लेबल ($ 0.9 9, इत्यादि) पर टैप करने से इसे "खरीदें" बटन में बदल दिया जाता है।) यह अधिसूचना वॉयसओवर को सभी सुलभ वस्तुओं की वर्तमान स्थिति को फिर से पढ़ने के लिए कहती है ऑन-स्क्रीन हैं, और ऐसा करके यह पता चलता है कि क्या बदल गया है और उन परिवर्तनों के उपयोगकर्ता को सूचित करता है। यह वॉयसओवर को अलर्ट करता है कि लेआउट बदल गया है और यह कि वर्तमान इंडेक्स पुराना है क्योंकि स्क्रीन पर मौजूद आइटमों ने खुद को फिर से व्यवस्थित किया है।

UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, nil); 
+3

ये उचित उदाहरण हैं, लेकिन वे सवाल का जवाब नहीं देते हैं। क्या आप उन दावों का समर्थन करने के लिए सबूत प्रदान कर सकते हैं कि ए) वॉयसओवर स्क्रीन परिवर्तन अधिसूचना के जवाब में "अपने कैश साफ़ करता है", लेकिन एक लेआउट परिवर्तन अधिसूचना नहीं है और बी) वॉयसओवर स्क्रीन परिवर्तन के जवाब में "उपयोगकर्ता को स्वर के साथ सूचित करता है" लेकिन लेआउट परिवर्तन नहीं है? – Justin

संबंधित मुद्दे