Accessibility Trait: mahiyyəti, hansı növləri var və inkişafda necə işləyir

Müəllif: IT Sectr Dərc olunub: 2026-05-16 Oxuma vaxtı: 9 dəq

Accessibility Trait — iOS elementinin VoiceOver üçün rolunu və davranışını təyin edən xüsusiyyətidir. Trait ekran oxuyucusuna elementin necə səsləndirilməli olduğunu və hansı jestlərin mövcud olduğunu bildirir: düymə, başlıq, keçid və ya axtarış sahəsi olması. Apple UIAccessibilityTraits, 2024 məlumatlarına görə, sistem bit maskası ilə birləşdirilə bilən 15+ sabit dəstəkləyir. Düzgün seçilmiş trait VoiceOver istifadəçiləri üçün naviqasiya vaxtını 50%-ə qədər azaldır.

Əsas məqamlar

  • Accessibility Trait — iOS elementinin VoiceOver üçün rolu; UIAccessibilityTraits sabitləri ilə təyin edilir
  • Traitlər mürəkkəb rollar yaratmaq üçün | operatoru ilə birləşdirilə bilər (düymə + seçilmiş)
  • Hər bir element eyni anda bir neçə traitə malik ola bilər, lakin qarışıqlığın qarşısını almaq üçün 3-4-dən çox olmamalıdır
  • Səhv trait (məsələn, düymə üçün StaticText) qarşılıqlı təsir ssenarisini pozur: istifadəçi jestin mövcud olub-olmadığını bilmir
  • Android-də analoq — AccessibilityNodeInfo-da role və className atributları

Accessibility Trait nədir

Accessibility Trait — VoiceOver üçün semantik rolunu göstərmək üçün UIView elementində quraşdırılan flagdır. Trait Apple-ın accessibility triadasının üç komponentindən biridir: Label (ad), Hint (təsvir), Trait (rol). iOS hər bitin müəyyən bir rolə uyğun gəldiyi UIAccessibilityTraits (UInt64) bit maskasından istifadə edir. VoiceOver rolu Label və Hint-dən sonra oxuyur: „Düymə Göndər. Formanı açacaq" — „Düymə" UIAccessibilityTraitButton traiti sayəsində əlavə edilmişdir.

Defolt olaraq UIButton UIAccessibilityTraitButton, UILabel — UIAccessibilityTraitStaticText, UIImageView — UIAccessibilityTraitImage alır. Xüsusi kontrollardan istifadə edərkən tərtibatçı traiti əl ilə quraşdırmalıdır. Apple Human Interface Guidelines, 2024, bunu „accessibility təmin edilməsində ən kritik addımlardan biri" adlandırır.

Düzgün trait olmadan istifadəçi hansı jesti tətbiq edəcəyini bilmir: tək toxunma (düymənin aktivləşdirilməsi), cüt toxunma (böyütmə) və ya sürüşdürmə jesti (keçid). Trait VoiceOver-in elementdə hansı jestləri aktivləşdirəcəyini müəyyən edir.

UIAccessibilityTraits-in texniki icrası

UIAccessibilityTraits — typealias UInt64-dir. Hər trait dəqiq bir bitin təyin olunduğu sabitdir. Məsələn, UIAccessibilityTraitButton = 0x0000000000000001, UIAccessibilityTraitLink = 0x0000000000000002, UIAccessibilityTraitHeader = 0x0000000000000008. Kombinasiya bitvi OR ilə əldə edilir: 0x0001 | 0x0008 = 0x0009. VoiceOver maskanı təhlil edir və davranışı müəyyənləşdirir.

iOS traitlərinin əsas növləri

iOS 15-dən çox trait sabiti təqdim edir. 90% ssenaridə istifadə olunan əsasları nəzərdən keçirək:

TraitSabitVoiceOver davranışı
ButtonUIAccessibilityTraitButtonCüt toxunma ilə aktivləşdirmə
HeaderUIAccessibilityTraitHeaderBaşlıqlar üzrə sürətli naviqasiya
LinkUIAccessibilityTraitLinkKeçid kimi aktivləşdirmə
StaticTextUIAccessibilityTraitStaticTextYalnız oxumaq, aktivləşdirmə yoxdur
SearchFieldUIAccessibilityTraitSearchFieldXüsusi davranışlı axtarış sahəsi
ImageUIAccessibilityTraitImageŞəkil, aktivləşdirmə jesti yoxdur
SelectedUIAccessibilityTraitSelected„Seçilmiş" vəziyyəti
PlaysSoundUIAccessibilityTraitPlaysSoundAktivləşdirmədə səs çalır
KeyboardKeyUIAccessibilityTraitKeyboardKeyKlaviatura düyməsi
TabBarUIAccessibilityTraitTabBarTab-bar elementi

Sabitlər UIKit-də iOS 3.0-dan etibarən mövcuddur. iOS 14+-da SwiftUI-də .accessibilityAddTraits() modifieri ilə UIAccessibilityTraits dəstəyi əlavə edilmişdir.

Nadir, lakin faydalı traitlər

UIAccessibilityTraitAdjustable — tənzimlənən dəyərlər üçün (sürgülər, seçicilər, səs sürgüləri). VoiceOver dəyəri accessibilityIncrement və accessibilityDecrement ilə müəyyən edilmiş addımla dəyişmək üçün yuxarı/aşağı sürüşdürməyə imkan verir. UIAccessibilityTraitUpdatesFrequently — tez-tez dəyişən dəyəri olan elementlər üçün (taymer, yükləmə göstəricisi). VoiceOver hər dəyişiklikdə dəyəri oxumur, fasilə verir. UIAccessibilityTraitAllowsDirectInteraction — istifadəçinin VoiceOver jestlərini keçərək birbaşa qarşılıqlı əlaqə qura biləcəyi elementlər üçün (klaviatura, rəsm alətləri).

Traitlərin birləşdirilməsi

Bir element eyni anda bir neçə traitə malik ola bilər — kombinasiya bitvi OR (|) ilə təyin edilir. Nümunə: hazırda seçilmiş düymə — Button | Selected. VoiceOver deyəcək: „Seçildi. Qiymətə görə filtr. Düymə".

Kodda traitlərin quraşdırılması:

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

// Və ya maska ilə:
filterButton.accessibilityTraits = [.button, .selected]

Traitin defolt olaraq təyin olunmadığı xüsusi UIView-lər üçün:

swift
class CustomToggle: UIControl {
    override var accessibilityTraits: UIAccessibilityTraits {
        get {
            if isOn {
                return [.button, .selected]
            } else {
                return .button
            }
        }
        set {}
    }
}

Birləşdirmə qaydası: element üçün 3-4 traitdən çox olmamalıdır. Həddindən artıq traitlər (məsələn, Button + Link + Header) VoiceOver bəyanatını çox uzun və çaşdırıcı edir. Apple-ın məlumatına görə, „hər əlavə xüsusiyyət istifadəçinin idrak yükünü artırır".

SwiftUI: trait modifierləri

SwiftUI-də traitlər .accessibilityAddTraits() və .accessibilityRemoveTraits() modifierləri ilə təyin edilir. Nümunə: Text("Başlıq").font(.largeTitle).accessibilityAddTraits(.isHeader). .isHeader modifieri UIAccessibilityTraitHeader-i əlavə edir. SwiftUI traitlərinin siyahısı: .isButton, .isHeader, .isLink, .isSelected, .isImage, .isSearchField, .isKeyboardKey, .isStaticText, .isSummaryElement, .isToggle, .playsSound, .startsMediaSession, .updatesFrequently, .allowsDirectInteraction, .causesPageTurn, .isModal, .tabBar.

Trait seçərkən tipik səhvlər

Button əvəzinə StaticText — vizual olaraq düyməyə bənzəyən xüsusi kontrol defolt olaraq StaticText traiti alır. VoiceOver aktivləşdirmə jesti təklif etmir, istifadəçi elementi „ basa" bilməz. Həll yolu: açıq şəkildə .button təyin edin.

Traitsiz Image — accessibility aktivləşdirilmiş UIImageView, əslində foto böyütmə düyməsi olsa belə, Image traiti alır. .button və „Şəkli böyüt" Label-i təyin edin. WWDC 2023, „Deliver an Exceptional Accessibility Experience" məlumatına görə, tətbiqlərin yeni versiyalarında accessibility reqressiyalarının 40%-i məhz trait uyğunsuzluğundan qaynaqlanır.

Hər elementdə Header — Header traiti ekranın struktur başlıqları üçün nəzərdə tutulub. Hər UILabel-i başlıq etsəniz, VoiceOver rotorunun „Başlıqlar" rejimi yararsız olacaq — hər sözdə dayanacaq.

Necə düzəltmək olar: yoxlama siyahısı

  • Hər interaktiv xüsusi element Button, Link və ya Adjustable traiti alır
  • Bölmə başlıqları Header traiti alır (StaticText yox)
  • Şəkil-düymələr selected vəziyyətində Button + Selected traiti alır
  • Jestsiz elementlər — StaticText və ya Image (yalnız oxumaq)

UIButton-dan UIControl-a keçid zamanı reqressiya səhvləri

Trait itkisinin ümumi səbəbi — refaktoring: tərtibatçı xüsusi görünüş üçün UIButton-u UIControl ilə əvəz edir. UIButton avtomatik Button traiti alır, UIControl — almır. Refaktoringdən sonra accessibilityTraits = .button açıq şəkildə təyin edilməlidir. Kod-review-ə yoxlama əlavə edin: „UIButton UIControl ilə əvəz edilibsə — traiti yoxlayın".

Traits and dynamic states

Dəyişən vəziyyəti olan elementlər üçün (məsələn, bəyənmə düyməsi) trait dinamik olaraq dəyişməlidir. „Bəyənilməmiş" vəziyyətdə — Button, „bəyənilmiş" vəziyyətdə — Button + Selected + Image (ikona varsa). VoiceOver bəyanatı dəyişir: „Bəyən. Düymə" vs „Seçildi. Bəyən. Düymə". Trait Selected kifayət etmirsə, vəziyyəti ötürmək üçün accessibilityValue istifadə edin. Abunə, seçilmiş, filtr və keçid düymələri üçün aktualdır.

Android analoqu: role və className

Android-də traitlərin birbaşa analoqu yoxdur. Bit maskası əvəzinə istifadə olunur:

  • className — AccessibilityNodeInfo.className dəyəri (android.widget.Button, android.widget.TextView)
  • role — XML-də atribut (rol View tipi ilə müəyyən edilir)
  • stateDescription — Selected analoqu: vəziyyət təsvirinin əlavə edilməsi (aktiv/deaktiv)

Android-də xüsusi View-lər üçün onInitializeAccessibilityNodeInfo-nı dəyişdirmək lazımdır:

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 tərtibatçıları Semantics vidjetində semanticsRole parametrindən istifadə etməlidirlər: button, header, image, link, textField və s. Əlavə olaraq semanticsLabelsemanticsHint mövcuddur — iOS triadası Label + Hint + Trait-in tam analoqu.

Web analoqlar: WAI-ARIA rolu

Mobil tətbiqlərin veb versiyaları (PWA, WebView) üçün WAI-ARIA-dan role atributu istifadə olunur: role="button", role="heading", role="link". Bu accessibilityTraits-in birbaşa analoqudur. Hibrid tətbiqlərdə WebView-in ARIA rollarını native accessibility qatına ötürdüyünü yoxlayın. Bunun üçün iOS-da UIAccessibilityContainerDataTable protokolundan və ya Android-də setAccessibilityDelegate-dən istifadə edin. JavaScript aktivləşdirilmiş WebView ARIA rollarını düzgün ötürməyə bilər — ayrıca test edin.

AccessibilityNodeInfo: əlavə hərəkətlər

Android-də AccessibilityNodeInfo-ya xüsusi hərəkətlər əlavə edilə bilər: AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK və ACTION_LONG_CLICK. Bu, əlavə jestlərlə Button traithinin analoqudur. Sürgülər üçün ACTION_SET_PROGRESS istifadə edin — Adjustable analoqu. Spinner və DatePicker üçün — ACTION_SET_SELECTION, ACTION_SET_DATE və ACTION_SET_TIME.

Traitlərin yoxlanılması və test edilməsi

Xcode Accessibility Inspector — iOS üçün əsas alət: elementi seçin və Traits sahəsinə baxın. Quraşdırılmış traitlərin siyahısını göstərəcək. „Elementlər" rejimində VoiceOver rotoru ekranın bütün kontrollarından keçməyə imkan verir.

Trait yoxlanılması üçün Swift-də avtomatlaşdırılmış test:

swift
func testSubmitButtonTrait() {
    let app = XCUIApplication()
    app.launch()
    let submitButton = app.buttons["Göndər"]
    XCTAssertTrue(submitButton.isEnabled)
    // XCUIElement traitlərə birbaşa giriş təmin etmir
    // Jest aktivləşdirməsi ilə yoxlama
    submitButton.tap()
    XCTAssertTrue(app.staticTexts["Forma göndərildi"].exists)
}

Əl ilə VoiceOver vasitəsilə yoxlama: VoiceOver-i yandırın, barmağınızı elementə aparın, iki dəfə toxunun — element Button-dırsa aktivləşməlidir. Element cüt toxunmaya reaksiya vermirsə, trait səhv göstərilib. Rejimlər arasında keçid üçün Rotor jestindən istifadə edin („Başlıqlar", „Keçidlər", „Düymələr") — hər rejim yalnız müvafiq traiti olan elementləri göstərəcək.

iOS-da traitlərin unit-testi

iOS 14-dən əvvəl unit-testlərin accessibilityTraits-ə birbaşa çıxışı yox idi. iOS 14-dən etibarən xüsusiyyət mövcuddur: XCTAssertEqual(customButton.accessibilityTraits, .button). Bunu xüsusi kontrolları yoxlamaq üçün modul testlərində istifadə edin. Hər yeni xüsusi UIView-in trait düzgünlüyünü, xüsusən refaktoringdən və ya ana sinif dəyişikliyindən sonra test etmək tövsiyə olunur.

Tez-tez verilən suallar

Bir elementə neçə trait təyin etmək olar?

Element üçün 3-4 traitədək. Daha çox say VoiceOver bəyanatını həddindən artıq edir. Kombinasiyalardan istifadə edin: Button + Selected, Header + StaticText.

UIButton-un defolt traiti hansıdır?

UIAccessibilityTraitButton. iOS onu bütün UIButton nümunələri üçün avtomatik təyin edir. UIView-dən miras alıb düyməni simulyasiya edirsinizsə, traiti əl ilə təyin etmək lazımdır.

„Adjustable" traiti varmı və nə üçündür?

Bəli, UIAccessibilityTraitAdjustable — tənzimlənən dəyəri olan elementlər üçün (sürgülər, seçicilər, sayğaclar). VoiceOver dəyəri dəyişmək üçün yuxarı/aşağı sürüşdürməyə imkan verir və cari vəziyyəti oxuyur.

SwiftUI-də traitləri necə yoxlamaq olar?

.accessibilityAddTraits() modifierindən istifadə edin: Text("Başlıq").font(.title).accessibilityAddTraits(.isHeader). Metod iOS 14+-da işləyir.

Xüsusi kontrol üçün trait təyin olunmasa nə olar?

VoiceOver None traiti təyin edəcək. Element rol almayacaq — ekran oxuyucusu tip göstərilmədən yalnız Label oxuyacaq. İstifadəçi aktivləşdirmə jestinin mövcud olub-olmadığını bilməyəcək.

Nəticə

  • Accessibility Trait — iOS elementinin VoiceOver üçün rolunu təyin edən UIAccessibilityTraits bit maskası (Button, Header, Link, StaticText və s.)
  • Traitlər bitvi OR (Swift-də []) ilə birləşdirilir, element başına 3-4-dən çox olmamalıdır
  • Xüsusi UIView-lər açıq trait almalıdır — defolt olaraq None və ya Image ola bilər
  • Android-də rol AccessibilityNodeInfo-da className vasitəsilə, Flutter-də semanticsRole ilə təyin edilir
  • Səhv trait (düymə üçün StaticText) VoiceOver ssenarisini pozur: aktivləşdirmə jesti yoxdur
  • Traitləri Xcode Accessibility Inspector və VoiceOver rotoru ilə yoxlayın
  • SwiftUI-də traitləri deklarativ şəkildə təyin etmək üçün .accessibilityAddTraits() istifadə edin

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun