Accessibility Trait — iOS elementining VoiceOver uchun roli va xatti-harakatini belgilaydigan xususiyatidir. Trait ekran o'qituvchisiga element qanday ovoz berilishi kerakligini va qanday imo-ishoralar mavjudligini bildiradi: tugma, sarlavha, havola yoki qidiruv maydoni ekanligini. Apple UIAccessibilityTraits, 2024 ma'lumotlariga ko'ra, tizim bit maskasi bilan birlashtirilishi mumkin bo'lgan 15+ doimiyni qo'llab-quvvatlaydi. To'g'ri tanlangan trait VoiceOver foydalanuvchilari uchun navigatsiya vaqtini 50% gacha tejaydi.
Asosiy fikrlar
Accessibility Trait — VoiceOver uchun semantik rolini ko'rsatish uchun UIView elementida o'rnatiladigan flag. Trait Apple accessibility triadasi uch komponentidan biridir: Label (nom), Hint (tavsif), Trait (rol). iOS har bir bit ma'lum bir rolga mos keladigan UIAccessibilityTraits (UInt64) bit maskasidan foydalanadi. VoiceOver rolni Label va Hint dan keyin o'qiydi: "Tugma Yuborish. Formani ochadi" — "Tugma" UIAccessibilityTraitButton traiti tufayli qo'shilgan.
Odatiy holda, UIButton UIAccessibilityTraitButton, UILabel — UIAccessibilityTraitStaticText, UIImageView — UIAccessibilityTraitImage oladi. Maxsus kontrollardan foydalanilganda, dasturchi traitni qo'lda o'rnatishi shart. Apple Human Interface Guidelines, 2024, buni "accessibility ta'minlashdagi eng muhim qadamlardan biri" deb ataydi.
To'g'ri traitsiz foydalanuvchi qaysi imo-ishorani qo'llashni bilmaydi: bir marta teginish (tugmani faollashtirish), ikki marta teginish (kattalashtirish) yoki surish imo-ishorasi (kalit). Trait VoiceOver elementda qaysi imo-ishoralarni faollashtirishini belgilaydi.
UIAccessibilityTraits — typealias UInt64. Har bir trait aniq bir bit o'rnatilgan doimiydir. Masalan, UIAccessibilityTraitButton = 0x0000000000000001, UIAccessibilityTraitLink = 0x0000000000000002, UIAccessibilityTraitHeader = 0x0000000000000008. Kombinatsiya bitli OR orqali erishiladi: 0x0001 | 0x0008 = 0x0009. VoiceOver maskani tahlil qiladi va xatti-harakatni belgilaydi.
iOS 15 dan ortiq trait doimiylarini taqdim etadi. 90% stsenariylarda ishlatiladigan asosiylarini ko'rib chiqaylik:
| Trait | Doimiy | VoiceOver xatti-harakati |
|---|---|---|
| Button | UIAccessibilityTraitButton | Ikki marta teginish bilan faollashtirish |
| Header | UIAccessibilityTraitHeader | Sarlavhalar bo'yicha tez navigatsiya |
| Link | UIAccessibilityTraitLink | Havola sifatida faollashtirish |
| StaticText | UIAccessibilityTraitStaticText | Faqat o'qish, faollashtirish yo'q |
| SearchField | UIAccessibilityTraitSearchField | Maxsus xatti-harakatli qidiruv maydoni |
| Image | UIAccessibilityTraitImage | Tasvir, faollashtirish imo-ishorasi yo'q |
| Selected | UIAccessibilityTraitSelected | "Tanlangan" holati |
| PlaysSound | UIAccessibilityTraitPlaysSound | Faollashtirilganda tovush chiqaradi |
| KeyboardKey | UIAccessibilityTraitKeyboardKey | Klaviatura tugmasi |
| TabBar | UIAccessibilityTraitTabBar | Tab-bar elementi |
Doimiylar UIKit da iOS 3.0 dan mavjud. iOS 14+ da SwiftUI da .accessibilityAddTraits() modifikatori orqali UIAccessibilityTraits qo'llab-quvvatlashi qo'shilgan.
UIAccessibilityTraitAdjustable — sozlanishi qiymatlar uchun (slayderlar, tanlovchilar, ovoz slayderlari). VoiceOver qiymatni accessibilityIncrement va accessibilityDecrement orqali belgilangan qadam bilan o'zgartirish uchun yuqoriga/pastga surish imkonini beradi. UIAccessibilityTraitUpdatesFrequently — tez-tez o'zgaruvchan qiymatga ega elementlar uchun (taymer, yuklanish indikatori). VoiceOver har bir o'zgarishda qiymatni o'qimaydi, balki pauza qiladi. UIAccessibilityTraitAllowsDirectInteraction — foydalanuvchi VoiceOver imo-ishoralarini chetlab o'tib, to'g'ridan-to'g'ri o'zaro aloqa qilishi mumkin bo'lgan elementlar uchun (klaviatura, chizish vositasi).
Bir element bir vaqtning o'zida bir nechta traitga ega bo'lishi mumkin — kombinatsiya bitli OR (|) bilan belgilanadi. Misol: hozirda tanlangan tugma — Button | Selected. VoiceOver: "Tanlandi. Narx bo'yicha filtr. Tugma" deb aytadi.
Kodda traitlarni o'rnatish:
filterButton.accessibilityTraits.insert(.button)
filterButton.accessibilityTraits.insert(.selected)
// Yoki maska orqali:
filterButton.accessibilityTraits = [.button, .selected]
Trait odatiy holda o'rnatilmagan maxsus UIViewlar uchun:
class CustomToggle: UIControl {
override var accessibilityTraits: UIAccessibilityTraits {
get {
if isOn {
return [.button, .selected]
} else {
return .button
}
}
set {}
}
}
Birlashtirish qoidasi: element uchun 3-4 traitdan ko'p bo'lmasligi kerak. Haddan tashqari traitlar (masalan, Button + Link + Header) VoiceOver bayonotini juda uzun va chigal qiladi. Apple ma'lumotlariga ko'ra, "har bir qo'shimcha xususiyat foydalanuvchining kognitiv yukini oshiradi".
SwiftUI da traitlar .accessibilityAddTraits() va .accessibilityRemoveTraits() modifikatorlari orqali o'rnatiladi. Misol: Text("Sarlavha").font(.largeTitle).accessibilityAddTraits(.isHeader). .isHeader modifikatori UIAccessibilityTraitHeader ni qo'shadi. SwiftUI traitlari ro'yxati: .isButton, .isHeader, .isLink, .isSelected, .isImage, .isSearchField, .isKeyboardKey, .isStaticText, .isSummaryElement, .isToggle, .playsSound, .startsMediaSession, .updatesFrequently, .allowsDirectInteraction, .causesPageTurn, .isModal, .tabBar.
Button o'rniga StaticText — vizual ravishda tugmaga o'xshash maxsus kontrol odatiy holda StaticText traiti oladi. VoiceOver faollashtirish imo-ishorasini taklif qilmaydi, foydalanuvchi elementni "bosa" olmaydi. Yechim: aniq .button ni o'rnating.
Traitsiz Image — accessibility yoqilgan UIImageView, aslida fotosuratni kattalashtirish tugmasi bo'lsa ham, Image traiti oladi. .button va "Fotosuratni kattalashtirish" Label ni o'rnating. WWDC 2023, "Deliver an Exceptional Accessibility Experience" ma'lumotlariga ko'ra, ilovalarning yangi versiyalarida accessibility regressiyalarining 40% aynan trait mos kelmasligidan kelib chiqadi.
Har bir elementda Header — Header traiti ekranning strukturaviy sarlavhalari uchun mo'ljallangan. Har bir UILabelni sarlavha qilsangiz, VoiceOver rotorining "Sarlavhalar" rejimi foydasiz bo'ladi — har bir so'zda to'xtaydi.
Trait yo'qolishining keng tarqalgan sababi — refaktoring: dasturchi maxsus ko'rinish uchun UIButton ni UIControl bilan almashtiradi. UIButton avtomatik Button traiti oladi, UIControl — olmaydi. Refaktoringdan so'ng aniq accessibilityTraits = .button o'rnatilishi kerak. Kod-ko'rib chiqishga tekshirish qo'shing: "Agar UIButton UIControl bilan almashtirilgan bo'lsa — traitni tekshiring".
O'zgaruvchan holatga ega elementlar uchun (masalan, like tugmasi) trait dinamik ravishda o'zgarishi kerak. "Yoqtirilmagan" holatda — Button, "yoqtirilgan" holatda — Button + Selected + Image (agar ikonka bo'lsa). VoiceOver bayonotni o'zgartiradi: "Yoqtiraman. Tugma" vs "Tanlandi. Yoqtiraman. Tugma". Trait Selected yetarli bo'lmasa, holatni uzatish uchun accessibilityValue dan foydalaning. Obuna, sevimlilar, filtr va kalit tugmalari uchun tegishli.
Android da traitlarning to'g'ridan-to'g'ri analogi yo'q. Bit maskasi o'rniga quyidagilar ishlatiladi:
Android da maxsus Viewlar uchun onInitializeAccessibilityNodeInfo ni o'zgartirish kerak:
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 dasturchilari Semantics vidjetida semanticsRole parametridan foydalanishlari kerak: button, header, image, link, textField va boshqalar. Qo'shimcha ravishda semanticsLabel va semanticsHint mavjud — iOS triadasi Label + Hint + Trait ning to'liq analogi.
Mobil ilovalarning veb versiyalari (PWA, WebView) uchun WAI-ARIA dan role atributi ishlatiladi: role="button", role="heading", role="link". Bu accessibilityTraits ning to'g'ridan-to'g'ri analogidir. Gibrid ilovalarda WebView ARIA rollarini native accessibility qatlamiga uzatishini tekshiring. Buning uchun iOS da UIAccessibilityContainerDataTable protokolidan yoki Android da setAccessibilityDelegate dan foydalaning. JavaScript yoqilgan WebView ARIA rollarini to'g'ri uzatmasligi mumkin — alohida test qiling.
Android da AccessibilityNodeInfo ga maxsus harakatlar qo'shilishi mumkin: AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK va ACTION_LONG_CLICK. Bu qo'shimcha imo-ishoralar bilan Button traiti analogidir. Slayderlar uchun ACTION_SET_PROGRESS dan foydalaning — Adjustable analogi. Spinner va DatePicker uchun — ACTION_SET_SELECTION, ACTION_SET_DATE va ACTION_SET_TIME.
Xcode Accessibility Inspector — iOS uchun asosiy vosita: elementni tanlang va Traits maydoniga qarang. O'rnatilgan traitlar ro'yxatini ko'rsatadi. "Elementlar" rejimidagi VoiceOver rotori ekranning barcha kontrollari bo'ylab o'tish imkonini beradi.
Traitni tekshirish uchun Swift da avtomatlashtirilgan test:
func testSubmitButtonTrait() {
let app = XCUIApplication()
app.launch()
let submitButton = app.buttons["Yuborish"]
XCTAssertTrue(submitButton.isEnabled)
// XCUIElement traitlarga to'g'ridan-to'g'ri kirishni ta'minlamaydi
// Imo-ishora faollashtirish orqali tekshirish
submitButton.tap()
XCTAssertTrue(app.staticTexts["Forma yuborildi"].exists)
}
Qo'lda VoiceOver orqali tekshirish: VoiceOver ni yoqing, barmog'ingizni elementga olib boring, ikki marta teging — element Button bo'lsa, faollashishi kerak. Element ikki marta teginishga reaksiya bermasa, trait noto'g'ri. Rejimlar o'rtasida o'tish uchun Rotor imo-ishorasidan foydalaning ("Sarlavhalar", "Havolalar", "Tugmalar") — har bir rejim faqat tegishli traiti bo'lgan elementlarni ko'rsatadi.
iOS 14 dan oldin unit testlari accessibilityTraits ga to'g'ridan-to'g'ri kirish imkoniga ega emas edi. iOS 14 dan boshlab xususiyat mavjud: XCTAssertEqual(customButton.accessibilityTraits, .button). Buni maxsus kontrollarni tekshirish uchun modul testlarida ishlating. Har bir yangi maxsus UIView ni, ayniqsa refaktoring yoki ota-ona sinf o'zgarishidan so'ng, trait to'g'riligiga tekshirish tavsiya etiladi.
Ko'p beriladigan savollar
Element uchun 3-4 traitgacha. Ko'proq son VoiceOver bayonotini ortiqcha qiladi. Kombinatsiyalardan foydalaning: Button + Selected, Header + StaticText.
UIAccessibilityTraitButton. iOS uni barcha UIButton namunalari uchun avtomatik o'rnatadi. Agar UIView dan meros olib tugmani simulyatsiya qilsangiz, traitni qo'lda o'rnatish kerak.
Ha, UIAccessibilityTraitAdjustable — sozlanishi qiymatga ega elementlar uchun (slayderlar, tanlovchilar, hisoblagichlar). VoiceOver qiymatni o'zgartirish uchun yuqoriga/pastga surish imkonini beradi va joriy holatni o'qiydi.
.accessibilityAddTraits() modifikatoridan foydalaning: Text("Sarlavha").font(.title).accessibilityAddTraits(.isHeader). Metod iOS 14+ da ishlaydi.
VoiceOver None traiti tayinlaydi. Element rol olmaydi — ekran o'qituvchisi turni ko'rsatmasdan faqat Label ni o'qiydi. Foydalanuvchi faollashtirish imo-ishorasi mavjudligini bilmaydi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.