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 — 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 — 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 15-dən çox trait sabiti təqdim edir. 90% ssenaridə istifadə olunan əsasları nəzərdən keçirək:
| Trait | Sabit | VoiceOver davranışı |
|---|---|---|
| Button | UIAccessibilityTraitButton | Cüt toxunma ilə aktivləşdirmə |
| Header | UIAccessibilityTraitHeader | Başlıqlar üzrə sürətli naviqasiya |
| Link | UIAccessibilityTraitLink | Keçid kimi aktivləşdirmə |
| StaticText | UIAccessibilityTraitStaticText | Yalnız oxumaq, aktivləşdirmə yoxdur |
| SearchField | UIAccessibilityTraitSearchField | Xüsusi davranışlı axtarış sahəsi |
| Image | UIAccessibilityTraitImage | Şəkil, aktivləşdirmə jesti yoxdur |
| Selected | UIAccessibilityTraitSelected | „Seçilmiş" vəziyyəti |
| PlaysSound | UIAccessibilityTraitPlaysSound | Aktivləşdirmədə səs çalır |
| KeyboardKey | UIAccessibilityTraitKeyboardKey | Klaviatura düyməsi |
| TabBar | UIAccessibilityTraitTabBar | Tab-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.
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).
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ı:
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:
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-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.
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.
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".
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-də traitlərin birbaşa analoqu yoxdur. Bit maskası əvəzinə istifadə olunur:
Android-də xüsusi View-lər üçün onInitializeAccessibilityNodeInfo-nı dəyişdirmək lazımdır:
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 semanticsLabel və semanticsHint mövcuddur — iOS triadası Label + Hint + Trait-in tam analoqu.
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.
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.
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:
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 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
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.
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.
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.
.accessibilityAddTraits() modifierindən istifadə edin: Text("Başlıq").font(.title).accessibilityAddTraits(.isHeader). Metod iOS 14+-da işləyir.
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ə
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.
Həm də oxuyun