Accessibility — bazele, VoiceOver și TalkBack pentru utilizatorii nevăzători

Autor: IT Sectr Publicat: 2026-02-26 Timp de citire: 9 min

Accessibility (a11y) — asigurarea accesibilității aplicației mobile pentru persoane cu dizabilități. Include suportul cititoarelor de ecran (VoiceOver pe iOS, TalkBack pe Android), scalarea textului (Dynamic Type), contrastul suficient al culorilor (WCAG 2.1 nivel AA), navigarea fără vedere și alternative la gesturi. Conform datelor OMS (2023), peste 1,3 miliarde de oameni (16% din populație) trăiesc cu o formă de dizabilitate — accessibility nu este o opțiune, ci o necesitate. Mai multe — în documentația oficială Apple privind accessibility.

Principalele

  • Accessibility — accesibilitatea aplicației pentru persoane cu dizabilități (vedere, auz, motricitate)
  • VoiceOver — cititorul de ecran Apple, care citește cu voce tare elementele interfeței pe iOS și macOS
  • TalkBack — cititorul de ecran Google pentru Android cu control gestual fără vedere
  • WCAG 2.1 — standardul internațional de accesibilitate: contrast 4.5:1, dimensiunea zonelor tactile 44×44pt
  • contentDescription — atributul Android pentru descrierea elementelor citite de TalkBack

Ce este Accessibility (a11y) în aplicațiile mobile?

Accessibility (prescurtat a11y — 11 litere între «a» și «y») — practica dezvoltării aplicațiilor accesibile pentru persoane cu deficiențe de vedere, auz, motricitate și trăsături cognitive. În dezvoltarea mobilă, accessibility acoperă patru scenarii principale: utilizatori nevăzători (cititoare de ecran), slab văzători (scalare, contrast), surzi și hipoacuzici (subtitrări, alternative vizuale la sunet), utilizatori cu motricitate limitată (control vocal, Switch Control, zonă tactilă mare).

Cerințe legale — în multe țări accessibility este obligatorie prin lege. SUA: Section 508 și ADA. UE: European Accessibility Act (2025). Marea Britanie: Equality Act 2010. Fără suport accessibility, aplicația poate deveni obiectul unui proces — în SUA în 2023 au fost depuse peste 4000 de procese privind inaccesibilitatea produselor digitale. Apple și Google verifică accessibility la moderarea aplicațiilor: App Store Review Guidelines (4.2) și Google Play Store solicită suport minim de accesibilitate.

Argumentul de afaceri — accesibilitatea crește audiența. Conform Return on Disability (2021), persoanele cu dizabilități controlează 13 trilioane de dolari venit disponibil pe an. Aplicațiile accesibile se clasează mai bine în căutare (HTML semantic, texte alternative), au un rating mai ridicat al utilizatorilor și mai puține recenzii despre probleme de UX. La IT Sectr includem accessibility în definition of done al tuturor proiectelor — este un standard de calitate, nu o îmbunătățire opțională.

Accessibility în iOS: VoiceOver și UIAccessibility

VoiceOver — cititorul de ecran Apple, încorporat în iOS, iPadOS și macOS. Utilizatorul deplasează degetul pe ecran, VoiceOver citește numele elementului sub deget. Atingere dublă — activarea elementului. VoiceOver suportă peste 40 de gesturi: trei degete glisare (derulare), două degete atingere dublă (oprire), gestul Z (înapoi). Dezvoltatorul controlează ce și cum citește VoiceOver prin protocolul UIAccessibility și proprietățile accessibilityLabel, accessibilityTraits, accessibilityHint.

swift
class CustomButton: UIButton {

    override var isAccessibilityElement: Bool {
        get { return true }
        set {}
    }

    // override accessibilityLabel
    override var accessibilityLabel: String? {
        get { return "Buton de trimitere a formularului" }
        set {}
    }

    // override accessibilityHint
    override var accessibilityHint: String? {
        get { return "Atingeți de două ori pentru a trimite datele" }
        set {}
    }

    // override accessibilityTraits
    override var accessibilityTraits: UIAccessibilityTraits {
        get { return .button }
        set {}
    }
}

// Dynamic Type — scalarea textului
titleLabel.font = UIFontMetrics.default.scaledFont(
    for: UIFont.systemFont(ofSize: 16)
)
titleLabel.adjustsFontForContentSizeCategory = true

Tipografie dinamică — Dynamic Type în iOS permite utilizatorului să aleagă dimensiunea textului (de la XS la XXXL). Dezvoltatorul folosește UIFontMetrics.scaledFont pentru scalare automată. Textul trebuie să se afișeze corect la toate dimensiunile: rândurile nu trebuie tăiate, butoanele trebuie să crească proporțional cu textul. UITableView actualizează automat înălțimea celulelor la schimbarea dimensiunii textului. Ignorarea Dynamic Type înseamnă a face aplicația inaccesibilă pentru utilizatorii slab văzători.

Accessibility în SwiftUI

SwiftUI oferă modificatori pentru accessibility: .accessibilityLabel(), .accessibilityHint(), .accessibilityAddTraits(), .accessibilitySortPriority(). În mod implicit, toate elementele standard SwiftUI (Text, Button, Image) sunt deja elemente accessibility cu etichete automate. Pentru View-uri personalizate, folosiți .accessibilityElement(children: .combine) pentru a combina elementele copil într-unul singur. SwiftUI suportă automat Dynamic Type și VoiceOver.

swift
VStack {
    Image(systemName: "trash")
        .accessibilityLabel(Text("Șterge elementul"))
    Text("Coș de gunoi")
        .font(.body)
}
.accessibilityElement(children: .combine)
.accessibilityAddTraits(.isButton)
.accessibilityHint(Text("Șterge elementul selectat fără posibilitatea de restaurare"))

Accessibility în Android: TalkBack și contentDescription

TalkBack — cititorul de ecran Google, preinstalat pe majoritatea dispozitivelor Android (disponibil în Google Play pentru toate versiunile Android 5+). TalkBack folosește aceleași gesturi ca VoiceOver: glisare pentru navigare, atingere dublă pentru activare. Dezvoltatorul setează descrierea elementelor prin atributul android:contentDescription în XML sau prin setContentDescription() în cod. Pentru ImageView, contentDescription este obligatoriu — fără el, TalkBack va raporta «neetichetat» sau va citi numele fișierului.

kotlin
// XML: contentDescription pentru ImageView
<ImageView
    android:id="@+id/iconDelete"
    android:src="@drawable/ic_delete"
    android:contentDescription="@string/delete_button_desc"
    android:focusable="true"
    android:clickable="true" />

// Kotlin: setare programatică
iconDelete.contentDescription = getString(R.string.delete_button_desc)

// Accessibility Delegate (personalizat)
iconDelete.accessibilityDelegate = object : View.AccessibilityDelegate() {
    override fun onInitializeAccessibilityNodeInfo(
        host: View, info: AccessibilityNodeInfo
    ) {
        super.onInitializeAccessibilityNodeInfo(host, info)
        info.text = "Buton de ștergere"
        info.contentDescription = "Șterge elementul selectat"
        info.className = Button::class.java.name
    }
}

// Live Regions pentru actualizări dinamice
textView.accessibilityLiveRegion = View.ACCESSIBILITY_LIVE_REGION_POLITE

Live Regions — mecanismul Android pentru notificarea TalkBack despre modificarea conținutului fără focalizare. Atributul android:accessibilityLiveRegion ia trei valori: none (fără notificări), polite (anunță după cel curent), assertive (anunță imediat). Folosiți polite pentru actualizări ale stării de încărcare, assertive — pentru erori critice. Abuzul de assertive duce la haos pentru utilizator — TalkBack va întrerupe constant acțiunea curentă.

Accessibility Scanner

Accessibility Scanner — aplicație gratuită de la Google pentru testarea accesibilității aplicațiilor Android fără acces la codul sursă. Scanerul verifică: contrastul textului, dimensiunea zonelor tactile (minimum 48×48dp conform Android Accessibility Guidelines), existența contentDescription pentru ImageView, corectitudinea ierarhiei elementelor. Pentru teste automate, folosiți AccessibilityChecks din Espresso — acestea se integrează în CI/CD și verifică accessibility la fiecare build.

WCAG 2.1: contrast, dimensiune și zone tactile

WCAG 2.1 (Web Content Accessibility Guidelines) — standardul internațional de accesibilitate dezvoltat de W3C. Versiunea 2.1 (2018) include 13 criterii suplimentare pentru aplicațiile mobile. Niveluri de conformitate: A (minim), AA (obligatoriu pentru majoritatea organizațiilor), AAA (maxim). Apple și Google recomandă nivelul AA ca minim pentru publicarea aplicațiilor. WCAG 2.2 a fost lansat în 2023 cu clarificări pentru focalizare și introducere date.

Criterii cheie pentru dezvoltarea mobilă: contrastul textului de cel puțin 4.5:1 (AA) sau 7:1 (AAA), dimensiunea zonelor tactile minim 44×44pt (iOS) sau 48×48dp (Android), suport pentru orientare peisaj și portret fără pierdere de funcționalitate, posibilitatea dezactivării animației (prefers-reduced-motion), existența subtitrărilor pentru multimedia, compatibilitatea cu controlul vocal (Voice Control pe iOS, Voice Access pe Android).

Criteriu WCAG 2.1NivelCerință pentru iOSCerință pentru Android
1.4.3 Contrast (text)AA4.5:1 pentru normal, 3:1 pentru mare4.5:1 pentru normal, 3:1 pentru mare
1.4.11 Contrast (non-text)AA3:1 pentru icoane, margini3:1 pentru icoane, margini
2.5.5 Dimensiunea ținteiAAA44×44pt48×48dp
2.3.3 AnimațieAAAprefers-reduced-motionandroid:animateLayoutChanges
4.1.2 Nume, rol, valoareAaccessibilityLabel, traitscontentDescription, role

Instrumente de verificare a contrastului — Colour Contrast Analyser (TPGI), WebAIM Contrast Checker, Stark (Figma), Accessibility Inspector (Xcode). La IT Sectr verificăm contrastul în faza de proiectare (Figma + Stark) și din nou în faza de dezvoltare (Accessibility Inspector / Accessibility Scanner). Cerința minimă — 4.5:1 pentru tot textul mai mic de 18pt (14pt bold). Pentru logo-uri și elemente decorative, contrastul nu este necesar.

Testarea accesibilității: instrumente și checklist

Testarea iOS — Accessibility Inspector în Xcode (Xcode → Open Developer Tool → Accessibility Inspector) verifică label, traits, hint pentru fiecare element. VoiceOver poate fi activat în setări sau prin Accessibility Shortcut (apăsare triplă a butonului). Pentru teste automate, folosiți XCUITest cu XCTAssertTrue(app.staticTexts["label"].isAccessibilityElement). Apple recomandă testarea tuturor ecranelor aplicației cu VoiceOver activat.

Testarea Android — Accessibility Scanner (Play Store) verifică contrastul, dimensiunea zonelor tactile, contentDescription. Pentru automatizare: Espresso AccessibilityChecks (import: androidTestImplementation 'androidx.test.espresso:espresso-accessibility:3.5.1'). Google recomandă următorul checklist: fiecare ImageView are contentDescription, zonele tactile nu sunt mai mici de 48×48dp, textul se scalează la 200% fără tăiere, toate elementele sunt accesibile prin glisarea TalkBack.

Checklist IT Sectr — înainte de lansare verificăm: (1) VoiceOver/TalkBack citește corect toate elementele, (2) textul se scalează la dimensiunea maximă fără pierdere de funcționalitate, (3) toate ImageView au contentDescription, (4) contrastul textului ≥4.5:1 în toate temele, (5) zonele tactile ≥44pt/48dp, (6) nu există meniu contextual accesibil doar prin apăsare lungă, (7) suport pentru Reduce Motion / Remove Animations în setările sistemului. Acest checklist face parte din definition of done al fiecărui sprint.

Întrebări frecvente

Cu ce se deosebește VoiceOver de TalkBack?

VoiceOver — cititorul de ecran Apple pentru iOS, iPadOS, macOS. Folosește gesturi cu unul și mai multe degete (glisare, atingere dublă). TalkBack — echivalentul Google pentru Android cu gesturi similare. VoiceOver citește accessibilityLabel, TalkBack — contentDescription. Ambele suportă afișaje Braille și control vocal. Nu există diferențe fundamentale în funcționalitate.

Ce este contentDescription în Android?

contentDescription — atributul View în Android care setează descrierea textului pentru TalkBack. Fără el, TalkBack raportează «neetichetat» sau citește numele clasei (ImageView, Button). Se adaugă prin android:contentDescription="@string/desc" în XML sau view.contentDescription = "text" în cod. Pentru imagini decorative, folosiți contentDescription=@null.

Care este contrastul minim pentru accessibility?

Conform WCAG 2.1 nivel AA: 4.5:1 pentru text normal și 3:1 pentru text mare (de la 18pt sau 14pt bold). Nivelul AAA: 7:1 pentru normal și 4.5:1 pentru mare. Verificați contrastul în două teme (deschisă/întunecată). Încălcarea contrastului este cea mai frecventă problemă de accesibilitate în aplicațiile mobile, conform datelor Google.

Trebuie să suport Dynamic Type în iOS?

Da, Apple recomandă Dynamic Type pentru toate aplicațiile. Utilizatorul setează dimensiunea textului în Setări. Dezvoltatorul folosește UIFontMetrics.scaledFont — fontul se scalează automat. Fără Dynamic Type, utilizatorii cu vedere slabă nu vor putea citi textul. iOS verifică automat Dynamic Type la moderarea în App Store.

Ce este WCAG?

WCAG (Web Content Accessibility Guidelines) — standardul internațional de accesibilitate a conținutului de la W3C. Versiunea 2.1 (2018) include criterii pentru aplicații mobile: contrast, dimensiunea zonelor tactile (44×44pt), suport pentru cititoare de ecran, alternative la gesturi, subtitrări. Nivelul AA — standardul minim pentru publicarea în App Store și Google Play.

Rezumat

  • Accessibility — accesibilitatea aplicațiilor pentru 1,3 miliarde de persoane cu dizabilități (OMS, 2023)
  • VoiceOver (iOS) și TalkBack (Android) — cititoare de ecran pentru utilizatorii nevăzători
  • UIAccessibility — protocolul iOS pentru setarea label, hint, traits elementelor accessibility
  • contentDescription — atributul Android pentru descrierea elementelor pentru TalkBack
  • WCAG 2.1 — contrast 4.5:1, zone tactile 44×44pt, suport Dynamic Type
  • Dynamic Type — scalarea textului în iOS prin UIFontMetrics.scaledFont
  • Testare — Accessibility Inspector (iOS), Accessibility Scanner (Android), Espresso Checks

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și