Accessibility सिर्फ एक टिक नहीं, बल्कि आपके ऐप की सुपरपावर क्यों है
\n\nकल्पना करें: आपने एक शानदार ऐप बनाया। सुंदर इंटरफ़ेस, तेज़ एनिमेशन, Swift में परफेक्ट कोड। आपको इस पर गर्व है। लेकिन अचानक पता चलता है कि 15% उपयोगकर्ता इसका उपयोग नहीं कर सकते। उनके लिए बटन बहुत छोटे हैं, टेक्स्ट बैकग्राउंड में घुल जाता है, और VoiceOver मेनू के बजाय बकवास "पढ़ता" है। परिचित लगता है?
\n\nAccessibility (सुलभता) "अनिवार्यता" या "सिर्फ टिक के लिए करना" नहीं है। यह समावेशिता, देखभाल और, महत्वपूर्ण रूप से, व्यवसाय के बारे में है। iOS में एक शक्तिशाली फ्रेमवर्क है जो ऐप को दृष्टि, श्रवण, मोटर और संज्ञानात्मक विशेषताओं वाले लोगों की ज़रूरतों के अनुसार अनुकूलित करने की अनुमति देता है। और Swift हमें इसे सुरुचिपूर्ण ढंग से करने के लिए सभी उपकरण देता है।
\n\nइस लेख में हम उबाऊ व्याख्यान नहीं पढ़ेंगे। हम विशिष्ट कोड उदाहरणों पर चर्चा करेंगे जिन्हें आप तुरंत प्रोजेक्ट में लागू कर सकते हैं। चलिए शुरू करते हैं!
\n\nVoiceOver: ऐप को अपने बारे में बताना कैसे "सिखाएं"
\n\nVoiceOver iOS में निर्मित एक स्क्रीन रीडर है। यह स्क्रीन पर होने वाली हर चीज़ को "बोलता" है: टेक्स्ट, बटन, जेस्चर। लेकिन अगर डेवलपर ने इंटरफ़ेस तैयार नहीं किया है, तो VoiceOver अराजकता में बदल सकता है। आइए इसे ठीक करें।
\n\nबुनियादी सेटिंग: accessibilityLabel और accessibilityTraits
\n\nVoiceOver की मदद करने का सबसे आसान तरीका तत्वों के लिए लेबल और प्रकार सेट करना है। उदाहरण के लिए, आपके पास दिल के आइकन वाला एक बटन है। लेबल के बिना, VoiceOver सिर्फ "बटन" कहेगा, लेबल के साथ यह "पसंदीदा में जोड़ें" कहेगा।
\n\nlet favoriteButton = UIButton(type: .system)\nfavoriteButton.setImage(UIImage(systemName: "heart"), for: .normal)\nfavoriteButton.accessibilityLabel = "पसंदीदा में जोड़ें"\nfavoriteButton.accessibilityTraits = .button\n\naccessibilityTraits पर ध्यान दें। यह VoiceOver के लिए एक संकेत है कि तत्व के साथ कैसे इंटरैक्ट करना है। बटन के लिए — .button, इमेज के लिए — .image, शीर्षक के लिए — .header। स्थिति को सटीक रूप से बताने के लिए .selected, .notEnabled और अन्य का उपयोग करें।
तत्वों को समूहित करना: VoiceOver को उपयोगकर्ता को "बकबक" करने से कैसे रोकें
\n\nकभी-कभी कई तत्वों को एक अर्थपूर्ण ब्लॉक में संयोजित करना तर्कसंगत होता है। उदाहरण के लिए, एक उत्पाद कार्ड: इमेज, नाम, मूल्य। यदि VoiceOver उन्हें अलग-अलग पढ़ता है, तो उपयोगकर्ता थक जाएगा। समाधान — UIAccessibilityElement या shouldGroupAccessibilityChildren है।
cardView.shouldGroupAccessibilityChildren = true\ncardView.accessibilityLabel = "Nike Air स्नीकर्स, 12,990 रुपये"\ncardView.accessibilityTraits = .button\n\nअब VoiceOver पूरे कार्ड को एक तत्व के रूप में पढ़ेगा। संक्षिप्त, सारगर्भित, स्पष्ट।
\n\nकस्टम क्रियाएँ: जब सिर्फ "टैप" से अधिक की आवश्यकता हो
\n\nजटिल तत्व होते हैं: स्लाइडर, स्विच, स्वाइप सूची। उनके लिए कस्टम क्रियाएँ जोड़ना महत्वपूर्ण है। उदाहरण के लिए, "हटाएं" और "संपादित करें" फ़ंक्शन वाले सेल के लिए:
\n\nlet 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\nVoiceOver उपयोगकर्ता क्रिया चुनने के लिए नीचे या ऊपर स्वाइप करता है। यह अनुभव को काफी बेहतर बनाता है।
\n\nDynamic Type: टेक्स्ट जो हर किसी के अनुकूल हो
\n\nकमजोर दृष्टि वाले लोग अक्सर iOS सेटिंग्स में फ़ॉन्ट आकार बढ़ाते हैं। यदि आपका ऐप Dynamic Type का समर्थन नहीं करता है, तो टेक्स्ट कट जाएगा, एक-दूसरे पर ओवरलैप हो जाएगा, या बस अपठनीय हो जाएगा। इससे कैसे बचें?
\n\nडायनामिक फ़ॉन्ट शैलियों का उपयोग करें
\n\nहार्डकोडेड UIFont.systemFont(ofSize: 16) के बजाय UIFont.preferredFont(forTextStyle: .body) का उपयोग करें।
label.font = UIFont.preferredFont(forText