Accessibility Trait: mohiyati, qanday turlari bor va ishlab chiqishda qanday ishlaydi

Muallif: IT Sectr Nashr etilgan: 2026-05-16 O'qish vaqti: 9 daq

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 — iOS elementining VoiceOver uchun roli; UIAccessibilityTraits doimiylari orqali o'rnatiladi
  • Traitlarni murakkab rollar yaratish uchun | operatori bilan birlashtirish mumkin (tugma + tanlangan)
  • Har bir element bir vaqtning o'zida bir nechta traitga ega bo'lishi mumkin, lekin chalkashlikni oldini olish uchun 3-4 tadan ko'p emas
  • Noto'g'ri trait (masalan, tugma uchun StaticText) o'zaro ta'sir stsenariysini buzadi: foydalanuvchi imo-ishora mavjudligini bilmaydi
  • Android-da analog — AccessibilityNodeInfo-dagi role va className atributlari

Accessibility Trait nima

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 texnik amalga oshirilishi

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 traitlarining asosiy turlari

iOS 15 dan ortiq trait doimiylarini taqdim etadi. 90% stsenariylarda ishlatiladigan asosiylarini ko'rib chiqaylik:

TraitDoimiyVoiceOver xatti-harakati
ButtonUIAccessibilityTraitButtonIkki marta teginish bilan faollashtirish
HeaderUIAccessibilityTraitHeaderSarlavhalar bo'yicha tez navigatsiya
LinkUIAccessibilityTraitLinkHavola sifatida faollashtirish
StaticTextUIAccessibilityTraitStaticTextFaqat o'qish, faollashtirish yo'q
SearchFieldUIAccessibilityTraitSearchFieldMaxsus xatti-harakatli qidiruv maydoni
ImageUIAccessibilityTraitImageTasvir, faollashtirish imo-ishorasi yo'q
SelectedUIAccessibilityTraitSelected"Tanlangan" holati
PlaysSoundUIAccessibilityTraitPlaysSoundFaollashtirilganda tovush chiqaradi
KeyboardKeyUIAccessibilityTraitKeyboardKeyKlaviatura tugmasi
TabBarUIAccessibilityTraitTabBarTab-bar elementi

Doimiylar UIKit da iOS 3.0 dan mavjud. iOS 14+ da SwiftUI da .accessibilityAddTraits() modifikatori orqali UIAccessibilityTraits qo'llab-quvvatlashi qo'shilgan.

Nodir, ammo foydali traitlar

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).

Traitlarni birlashtirish

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:

swift
filterButton.accessibilityTraits.insert(.button)
filterButton.accessibilityTraits.insert(.selected)

// Yoki maska orqali:
filterButton.accessibilityTraits = [.button, .selected]

Trait odatiy holda o'rnatilmagan maxsus UIViewlar uchun:

swift
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: trait modifikatorlari

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.

Trait tanlashdagi odatiy xatolar

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.

Qanday tuzatish kerak: tekshirish ro'yxati

  • Har bir interaktiv maxsus element Button, Link yoki Adjustable traiti oladi
  • Bo'lim sarlavhalari Header traiti oladi (StaticText emas)
  • Tasvir-tugmalar selected holatida Button + Selected traiti oladi
  • Imo-ishorasiz elementlar — StaticText yoki Image (faqat o'qish)

UIButton dan UIControl ga o'tishdagi regressiya xatolari

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".

Traitlar va dinamik holatlar

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 analoglari: role va className

Android da traitlarning to'g'ridan-to'g'ri analogi yo'q. Bit maskasi o'rniga quyidagilar ishlatiladi:

  • className — AccessibilityNodeInfo.className qiymati (android.widget.Button, android.widget.TextView)
  • role — XML dagi atribut (rol View turi bilan belgilanadi)
  • stateDescription — Selected analogi: holat tavsifini qo'shish (yoqilgan/o'chirilgan)

Android da maxsus Viewlar uchun onInitializeAccessibilityNodeInfo ni o'zgartirish kerak:

kotlin
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.

Web analoglari: WAI-ARIA role

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.

AccessibilityNodeInfo: qo'shimcha harakatlar

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.

Traitlarni tekshirish va test qilish

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:

swift
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 da traitlarning unit testi

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

Bitta elementga nechta trait o'rnatish mumkin?

Element uchun 3-4 traitgacha. Ko'proq son VoiceOver bayonotini ortiqcha qiladi. Kombinatsiyalardan foydalaning: Button + Selected, Header + StaticText.

UIButton ning odatiy traiti qanday?

UIAccessibilityTraitButton. iOS uni barcha UIButton namunalari uchun avtomatik o'rnatadi. Agar UIView dan meros olib tugmani simulyatsiya qilsangiz, traitni qo'lda o'rnatish kerak.

"Adjustable" traiti bormi va u nima uchun?

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.

SwiftUI da traitlarni qanday tekshirish mumkin?

.accessibilityAddTraits() modifikatoridan foydalaning: Text("Sarlavha").font(.title).accessibilityAddTraits(.isHeader). Metod iOS 14+ da ishlaydi.

Maxsus kontrol uchun trait o'rnatilmasa nima bo'ladi?

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

  • Accessibility Trait — iOS elementining VoiceOver uchun rolini belgilaydigan UIAccessibilityTraits bit maskasi (Button, Header, Link, StaticText va boshqalar)
  • Traitlar bitli OR (Swift da []) bilan birlashtiriladi, element boshiga 3-4 tadan ko'p emas
  • Maxsus UIViewlar aniq trait olishi kerak — odatiy holda None yoki Image bo'lishi mumkin
  • Android da rol AccessibilityNodeInfo da className orqali, Flutter da semanticsRole orqali belgilanadi
  • Noto'g'ri trait (tugma uchun StaticText) VoiceOver stsenariysini buzadi: faollashtirish imo-ishorasi yo'q
  • Traitlarni Xcode Accessibility Inspector va VoiceOver rotori orqali tekshiring
  • SwiftUI da traitlarni deklarativ o'rnatish uchun .accessibilityAddTraits() dan foydalaning

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.

Loyihani muhokama qilish

Shuningdek o'qing