Accessibility Trait ایک iOS عنصر کی خاصیت ہے جو VoiceOver کے لیے اس کے کردار اور رویے کا تعین کرتی ہے۔ ٹریٹ اسکرین ریڈر کو بتاتا ہے کہ عنصر کیسے پڑھا جانا چاہیے اور کون سے اشارے دستیاب ہیں: چاہے وہ بٹن ہو، ہیڈر ہو، لنک ہو یا سرچ فیلڈ۔ Apple UIAccessibilityTraits، 2024 کے مطابق، سسٹم 15+ مستقلات کو سپورٹ کرتا ہے جنہیں بٹ ماسک کے ذریعے یکجا کیا جا سکتا ہے۔ صحیح طریقے سے منتخب کردہ ٹریٹ VoiceOver صارفین کے لیے نیویگیشن کا 50% تک وقت بچاتا ہے۔
اہم نکات
Accessibility Trait ایک UIView عنصر پر سیٹ کردہ ایک جھنڈی ہے جو VoiceOver کو اس کا معنوی کردار بتاتی ہے۔ ٹریٹ Apple کی رسائی پذیری سہ رخی کے تین اجزاء میں سے ایک ہے: Label (نام)، Hint (تفصیل)، Trait (کردار)۔ iOS UIAccessibilityTraits بٹ ماسک (UInt64) استعمال کرتا ہے، جہاں ہر بٹ ایک مخصوص کردار سے مطابقت رکھتا ہے۔ VoiceOver Label اور Hint کے بعد کردار پڑھتا ہے: «بھیجیں بٹن۔ ایک فارم کھلے گا» — UIAccessibilityTraitButton ٹریٹ کی بدولت «بٹن» شامل کیا گیا ہے۔
بطور ڈیفالٹ، UIButton UIAccessibilityTraitButton حاصل کرتا ہے، UILabel UIAccessibilityTraitStaticText حاصل کرتا ہے، UIImageView UIAccessibilityTraitImage حاصل کرتا ہے۔ حسب ضرورت کنٹرول استعمال کرتے وقت، ڈویلپر کو دستی طور پر ٹریٹ سیٹ کرنا ہوتا ہے۔ Apple Human Interface Guidelines، 2024، اسے «رسائی پذیری کو یقینی بنانے کے سب سے اہم اقدامات میں سے ایک» کہتے ہیں۔
صحیح ٹریٹ کے بغیر، صارف نہیں جانتا کہ کون سا اشارہ استعمال کرنا ہے: واحد ٹیپ (بٹن فعال کرنا)، ڈبل ٹیپ (زوم) یا سوائپ اشارہ (ٹوگل)۔ ٹریٹ یہ طے کرتا ہے کہ عنصر پر VoiceOver کے کون سے اشارے فعال ہوتے ہیں۔
UIAccessibilityTraits ایک typealias UInt64 ہے۔ ہر ٹریٹ ایک مستقل ہے جس میں بالکل ایک بٹ سیٹ ہوتا ہے۔ مثال کے طور پر، UIAccessibilityTraitButton = 0x0000000000000001، UIAccessibilityTraitLink = 0x0000000000000002، UIAccessibilityTraitHeader = 0x0000000000000008۔ یکجائی بٹ وار OR سے حاصل ہوتی ہے: 0x0001 | 0x0008 = 0x0009۔ VoiceOver ماسک کا تجزیہ کرتا ہے اور رویے کا تعین کرتا ہے۔
iOS 15 سے زیادہ ٹریٹ مستقلات فراہم کرتا ہے۔ آئیے 90% منظرناموں میں استعمال ہونے والی اہم اقسام پر نظر ڈالتے ہیں:
| ٹریٹ | مستقل | VoiceOver رویہ |
|---|---|---|
| Button | UIAccessibilityTraitButton | ڈبل ٹیپ سے فعال کرنا |
| Header | UIAccessibilityTraitHeader | ہیڈر کے ذریعے تیز نیویگیشن |
| Link | UIAccessibilityTraitLink | لنک کے طور پر فعال کرنا |
| StaticText | UIAccessibilityTraitStaticText | صرف پڑھنا، کوئی فعال کرنا نہیں |
| SearchField | UIAccessibilityTraitSearchField | خاص رویے والا سرچ فیلڈ |
| Image | UIAccessibilityTraitImage | تصویر، کوئی فعال کرنے کا اشارہ نہیں |
| Selected | UIAccessibilityTraitSelected | «منتخب» حالت |
| PlaysSound | UIAccessibilityTraitPlaysSound | فعال ہونے پر آواز چلاتا ہے |
| KeyboardKey | UIAccessibilityTraitKeyboardKey | کی بورڈ کی |
| TabBar | UIAccessibilityTraitTabBar | ٹیب بار عنصر |
مستقلات iOS 3.0 سے UIKit میں دستیاب ہیں۔ iOS 14+ نے .accessibilityAddTraits() موڈیفائر کے ذریعے SwiftUI میں UIAccessibilityTraits سپورٹ شامل کیا۔
UIAccessibilityTraitAdjustable — ایڈجسٹ قابل اقدار کے لیے (سلائیڈرز، پکرز، والیوم سلائیڈرز)۔ VoiceOver accessibilityIncrement اور accessibilityDecrement کے ذریعے بیان کردہ مرحلے کے ساتھ قدر تبدیل کرنے کے لیے اوپر/نیچے سوائپ کرنے کی اجازت دیتا ہے۔ UIAccessibilityTraitUpdatesFrequently — بار بار تبدیل ہونے والی اقدار والے عناصر کے لیے (ٹائمر، پیش رفت اشارہ)۔ VoiceOver ہر تبدیلی پر قدر نہیں پڑھتا بلکہ توقف کرتا ہے۔ UIAccessibilityTraitAllowsDirectInteraction — ان عناصر کے لیے جن کے ساتھ صارف براہ راست تعامل کر سکتا ہے (کی بورڈ، ڈرائنگ)، VoiceOver اشاروں کو نظرانداز کرتے ہوئے۔
ایک عنصر میں ایک ساتھ کئی ٹریٹس ہو سکتے ہیں — یکجائی بٹ وار OR (|) کے ذریعے سیٹ کی جاتی ہے۔ مثال: ایک بٹن جو فی الحال منتخب ہے — Button | Selected۔ VoiceOver اعلان کرے گا: «منتخب۔ قیمت کے مطابق فلٹر کیا گیا۔ بٹن۔»
کوڈ میں ٹریٹس سیٹ کرنا:
filterButton.accessibilityTraits.insert(.button)
filterButton.accessibilityTraits.insert(.selected)
// یا ماسک کے ذریعے:
filterButton.accessibilityTraits = [.button, .selected]
حسب ضرورت UIView کے لیے جہاں ٹریٹ ڈیفالٹ طور پر سیٹ نہیں ہے:
class CustomToggle: UIControl {
override var accessibilityTraits: UIAccessibilityTraits {
get {
if isOn {
return [.button, .selected]
} else {
return .button
}
}
set {}
}
}
یکجائی کا قاعدہ: فی عنصر 3-4 ٹریٹس سے زیادہ نہیں۔ ضرورت سے زیادہ ٹریٹس (مثلاً Button + Link + Header) VoiceOver اعلان کو بہت لمبا اور مبہم بنا دیتے ہیں۔ Apple کے مطابق، «ہر اضافی خاصیت صارف پر علمی بوجھ بڑھاتی ہے»۔
SwiftUI میں، ٹریٹس .accessibilityAddTraits() اور .accessibilityRemoveTraits() موڈیفائرز کے ذریعے سیٹ کیے جاتے ہیں۔ مثال: Text(«عنوان»).font(.largeTitle).accessibilityAddTraits(.isHeader)۔ .isHeader موڈیفائر UIAccessibilityTraitHeader شامل کرتا ہے۔ SwiftUI ٹریٹ کی فہرست: .isButton، .isHeader، .isLink، .isSelected، .isImage، .isSearchField، .isKeyboardKey، .isStaticText، .isSummaryElement، .isToggle، .playsSound، .startsMediaSession، .updatesFrequently، .allowsDirectInteraction، .causesPageTurn، .isModal، .tabBar۔
بٹن کی بجائے StaticText — ایک حسب ضرورت کنٹرول جو دیکھنے میں بٹن جیسا لگتا ہے ڈیفالٹ طور پر StaticText ٹریٹ حاصل کرتا ہے۔ VoiceOver کوئی فعال کرنے کا اشارہ فراہم نہیں کرتا، لہٰذا صارف عنصر کو «دبا» نہیں سکتا۔ حل: واضح طور پر .button سیٹ کریں۔
ٹریٹ کے بغیر تصویر — رسائی پذیری فعال UIImageView کو Image ٹریٹ ملتا ہے، چاہے وہ حقیقت میں فوٹو بڑا کرنے کا بٹن ہی کیوں نہ ہو۔ .button اور Label «فوٹو بڑا کریں» تفویض کریں۔ WWDC 2023، «Deliver an Exceptional Accessibility Experience» کے مطابق، نئی ایپ ورژنز میں 40% رسائی پذیری رجعت ٹریٹ کی بے مطابقت کی وجہ سے ہوتی ہے۔
ہر عنصر پر Header — Header ٹریٹ اسکرین کے ساختی ہیڈرز کے لیے ہے۔ اگر ہر UILabel کو ہیڈر بنا دیا جائے، VoiceOver روٹر «ہیڈرز» موڈ میں بیکار ہو جاتا ہے — یہ ہر لفظ پر رکے گا۔
ٹریٹ کھونے کی ایک عام وجہ ری فیکٹرنگ ہے: ڈویلپر حسب ضرورت ڈسپلے کے لیے UIButton کو UIControl سے بدل دیتا ہے۔ UIButton خودکار طور پر Button ٹریٹ حاصل کرتا ہے، UIControl نہیں کرتا۔ ری فیکٹرنگ کے بعد، آپ کو واضح طور پر accessibilityTraits = .button سیٹ کرنا ہوگا۔ کوڈ ریویو میں ایک چیک شامل کریں: «اگر آپ نے UIButton کو UIControl سے بدلا ہے — ٹریٹ چیک کریں۔»
بدلتی ہوئی حالت والے عناصر کے لیے (مثلاً لائک بٹن)، ٹریٹ کو متحرک طور پر بدلنا چاہیے۔ «پسند نہیں کیا» حالت میں — Button، «پسند کیا» حالت میں — Button + Selected + Image (اگر آئیکن ہے)۔ VoiceOver اعلان بدلتا ہے: «پسند کریں۔ بٹن۔» بمقابلہ «منتخب۔ پسند کریں۔ بٹن۔» اگر Selected ٹریٹ ناکافی ہے تو حالت بتانے کے لیے accessibilityValue استعمال کریں۔ سبسکرائب بٹن، پسندیدہ، فلٹرز اور ٹوگلز کے لیے موزوں۔
Android میں، ٹریٹس کا کوئی براہ راست متبادل نہیں ہے۔ بٹ ماسک کی بجائے، مندرجہ ذیل استعمال ہوتے ہیں:
Android میں حسب ضرورت View کے لیے، آپ کو onInitializeAccessibilityNodeInfo اوور رائڈ کرنا ہوگا:
class CustomButton @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null
) : View(context, attrs) {
override fun onInitializeAccessibilityNodeInfo(
info: AccessibilityNodeInfo
) {
super.onInitializeAccessibilityNodeInfo(info)
info.className = "android.widget.Button"
info.isClickable = true
}
}
Flutter ڈویلپرز کو Semantics ویجٹ میں semanticsRole پیرامیٹر استعمال کرنا چاہیے: button، header، image، link، textField اور دیگر۔ مزید برآں، semanticsLabel اور semanticsHint دستیاب ہیں — iOS سہ رخی Label + Hint + Trait کا مکمل متبادل۔
موبائل ایپس (PWA، WebView) کے ویب ورژنز کے لیے، WAI-ARIA سے role وصف استعمال ہوتا ہے: role="button"، role="heading"، role="link"۔ یہ accessibilityTraits کا براہ راست متبادل ہے۔ ہائبرڈ ایپس میں، تصدیق کریں کہ WebView ARIA کرداروں کو مقامی رسائی پذیری پرت تک پہنچاتا ہے۔ اس کے لیے، iOS میں UIAccessibilityContainerDataTable پروٹوکول یا Android میں setAccessibilityDelegate استعمال کریں۔ JavaScript فعال WebView ARIA کرداروں کو صحیح طور پر نہیں پہنچا سکتا — الگ سے جانچ کریں۔
Android میں، آپ AccessibilityNodeInfo میں حسب ضرورت اعمال شامل کر سکتے ہیں: AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK اور ACTION_LONG_CLICK۔ یہ اضافی اشاروں کے ساتھ Button ٹریٹ کے برابر ہے۔ سلائیڈرز کے لیے، ACTION_SET_PROGRESS استعمال کریں — Adjustable کا متبادل۔ Spinner اور DatePicker کے لیے — ACTION_SET_SELECTION، ACTION_SET_DATE اور ACTION_SET_TIME۔
Xcode Accessibility Inspector iOS کے لیے بنیادی ٹول ہے: ایک عنصر منتخب کریں اور Traits فیلڈ دیکھیں۔ یہ سیٹ کردہ ٹریٹس کی فہرست دکھائے گا۔ «عناصر» موڈ والا VoiceOver روٹر اسکرین کے تمام کنٹرولز پر نیویگیٹ کرنے کی اجازت دیتا ہے۔
ٹریٹ جانچنے کے لیے خودکار Swift ٹیسٹ:
func testSubmitButtonTrait() {
let app = XCUIApplication()
app.launch()
let submitButton = app.buttons["بھیجیں"]
XCTAssertTrue(submitButton.isEnabled)
// XCUIElement ٹریٹس تک براہ راست رسائی فراہم نہیں کرتا
// اشارے کی فعال کرنے کے ذریعے جانچ
submitButton.tap()
XCTAssertTrue(app.staticTexts["فارم بھیج دیا گیا"].exists)
}
VoiceOver کے ذریعے دستی جانچ: VoiceOver آن کریں، عنصر پر سوائپ کریں، ڈبل ٹیپ کریں — اگر یہ Button ہے تو عنصر فعال ہونا چاہیے۔ اگر عنصر ڈبل ٹیپ پر جواب نہیں دیتا، ٹریٹ غلط ہے۔ Rotor اشارہ استعمال کریں موڈز کے درمیان سوئچ کرنے کے لیے («ہیڈرز»، «لنکس»، «بٹن») — ہر موڈ صرف متعلقہ ٹریٹ والے عناصر دکھائے گا۔
iOS 14 سے پہلے، یونٹ ٹیسٹس کی accessibilityTraits تک براہ راست رسائی نہیں تھی۔ iOS 14 سے شروع ہو کر، خاصیت دستیاب ہے: XCTAssertEqual(customButton.accessibilityTraits, .button)۔ حسب ضرورت کنٹرولز کی تصدیق کے لیے یونٹ ٹیسٹس میں اسے استعمال کریں۔ ہر نئے حسب ضرورت UIView کے درست ٹریٹ کی جانچ کرنے کی سفارش کی جاتی ہے، خاص طور پر ری فیکٹرنگ یا پیرنٹ کلاس تبدیل کرنے کے بعد۔
اکثر پوچھے گئے سوالات
فی عنصر 3-4 ٹریٹس تک۔ زیادہ تعداد VoiceOver اعلان کو غیر ضروری بناتی ہے۔ مجموعے استعمال کریں: Button + Selected، Header + StaticText۔
UIAccessibilityTraitButton۔ iOS اسے تمام UIButton مثالوں کے لیے خودکار طور پر سیٹ کرتا ہے۔ اگر آپ UIView سے وراثت پاتے ہیں اور بٹن نقل کرتے ہیں، ٹریٹ دستی طور پر سیٹ کیا جانا چاہیے۔
ہاں، UIAccessibilityTraitAdjustable — ایڈجسٹ قابل اقدار والے عناصر کے لیے (سلائیڈرز، پکرز، کاؤنٹرز)۔ VoiceOver قدر تبدیل کرنے اور موجودہ حالت پڑھنے کے لیے اوپر/نیچے سوائپ کرنے کی اجازت دیتا ہے۔
.accessibilityAddTraits() موڈیفائر استعمال کریں: Text(«عنوان»).font(.title).accessibilityAddTraits(.isHeader)۔ طریقہ iOS 14+ پر کام کرتا ہے۔
VoiceOver None ٹریٹ تفویض کرے گا۔ عنصر کو کوئی کردار نہیں ملے گا — اسکرین ریڈر قسم بتائے بغیر صرف Label پڑھے گا۔ صارف کو معلوم نہیں ہوگا کہ فعال کرنے کا اشارہ دستیاب ہے یا نہیں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں