VoiceOver — este cititorul de ecran (screen reader) încorporat de la Apple, care vocalizează fiecare element al interfeței și permite controlarea dispozitivului prin gesturi. Tehnologia este integrată în iOS, iPadOS și macOS la nivel de sistem și nu necesită instalarea de software suplimentar. Conform Apple Accessibility (2025), VoiceOver suportă peste 40 de limbi și este folosit de milioane de utilizatori nevăzători și cu deficiențe de vedere din întreaga lume.
Principalele puncte
VoiceOver — este un cititor de ecran (screen reader) încorporat în sistemele de operare Apple. Este destinat utilizatorilor nevăzători și cu deficiențe de vedere și asigură o interacțiune completă cu dispozitivul fără contact vizual. VoiceOver vocalizează toate elementele interfeței: butoane, linkuri, text, imagini, notificări și elemente de sistem.
Tehnologia a fost prezentată pentru prima dată în 2005 pentru macOS, iar pe iOS a apărut odată cu iPhone 3GS în 2009. De atunci, VoiceOver a devenit o parte integrantă a ecosistemului Apple și unul dintre principalele argumente pentru accesibilitatea platformei. VoiceOver este încorporat la nivel de sistem — ceea ce înseamnă că funcționează în orice aplicație fără integrare suplimentară din partea dezvoltatorului, deși calitatea vocalizării depinde direct de cât de bine aplicația utilizează API-ul de accesibilitate iOS.
VoiceOver suportă peste 40 de limbi cu sinteză naturală a vocii și se adaptează la setările regionale de voce. Pe iOS, VoiceOver utilizează motoarele vocale Siri pentru română și alte limbi, asigurând o sonoritate cât mai naturală și intonația corectă în funcție de punctuație și context.
VoiceOver interceptează evenimentele de atingere și le interpretează altfel decât introducerea standard iOS. Când utilizatorul atinge ecranul, VoiceOver nu activează elementul sub deget, ci mai întâi îl vocalizează. Abia după o atingere dublă, elementul este activat. Aceasta este diferența cheie care permite utilizatorilor nevăzători să exploreze interfața fără riscul de a apăsa accidental.
VoiceOver citește elementele interfeței în ordine logică: de la stânga la dreapta, de sus în jos. Ordinea de citire este moștenită din ierarhia vizualizărilor iOS, dar dezvoltatorul o poate modifica prin proprietatea accessibilityElements pentru layout-uri complexe. Utilizatorul se poate deplasa între elemente cu o glisare la dreapta (următorul) și la stânga (anteriorul), precum și atingând un element specific pentru a-l vocaliza.
La fiecare deplasare, VoiceOver rostește tipul elementului (buton, link, titlu), numele său (accessibilityLabel), starea (selectat, dezactivat) și sugestia (accessibilityHint). Dacă elementul conține o valoare — de exemplu, un glisor de volum — VoiceOver o vocalizează și pe aceasta. Trăsăturile de accesibilitate (UIAccessibilityTraits) informează suplimentar utilizatorul despre comportamentul elementului: dacă este un buton, un comutator, o căutare sau o tastă de tastatură.
Rotorul — este un mâner virtual de reglare care comută modul de navigare VoiceOver. Utilizatorul rotește rotorul cu două degete (ca un mâner de volum) și selectează modul: cuvinte, caractere, titluri, linkuri, puncte de intrare, rânduri de tabel și altele. Modul titluri permite comutarea rapidă între H1-H6 pe pagini web și în aplicații, iar modul caractere — pronunțarea textului literă cu literă, util la completarea formularelor sau introducerea codurilor de confirmare.
Dezvoltatorul poate adăuga moduri proprii în rotor prin API-ul UIAccessibilityCustomRotor. De exemplu, într-o aplicație de notițe se poate adăuga rotorul „Notițe favorite" sau „Modificări recente". Rotoarele personalizate accelerează semnificativ navigarea în aplicații specifice și sunt considerate cea mai bună practică de accesibilitate pe iOS.
VoiceOver folosește propriul set de gesturi care nu coincid cu gesturile standard iOS. Majoritatea gesturilor se execută cu trei degete în loc de unul — aceasta previne conflictele cu controlul obișnuit și permite VoiceOver să funcționeze simultan cu introducerea standard.
| Acțiune | Gest | Rezultat |
|---|---|---|
| Vocalizare element | Atingere cu 1 deget | Pronunță numele elementului |
| Activare | Atingere dublă | Apăsarea butonului sau linkului |
| Următorul element | Glisare la dreapta | Trecerea la următorul |
| Elementul anterior | Glisare la stânga | Înapoi la anterior |
| Derulare | 3 degete glisare | Derularea listei sau paginii |
| Rotor | 2 degete rotire | Schimbarea modului de navigare |
Gestul atingere dublă este modul principal de activare a elementelor în VoiceOver. Dacă elementul necesită o acțiune specială (de exemplu, tragerea), VoiceOver folosește secvența „atingere — atingere dublă și menținere" pentru a intra în modul de mutare. Aceasta permite executarea de gesturi complexe, cum ar fi drag-and-drop, fără a vedea ecranul. VoiceOver suportă și gestul „atingere dublă cu două degete" pentru anularea acțiunii și „atingere triplă" pentru activarea/dezactivarea perdelei de ecran (Screen Curtain).
Dezvoltatorul unei aplicații iOS poate îmbunătăți semnificativ interacțiunea cu VoiceOver prin API-ul UIAccessibility. Setările de bază de accesibilitate se adaugă în Interface Builder (Identity Inspector → Accessibility), dar pentru interfețe complexe este necesară configurarea programatică în cod.
Proprietatea accessibilityLabel stabilește textul pe care VoiceOver îl pronunță pentru element. Dacă eticheta nu este setată, VoiceOver folosește textul butonului sau placeholder-ul câmpului text. Pentru elemente fără text (icoane, vizualizări personalizate), eticheta este obligatorie. Proprietatea accessibilityTraits determină tipul elementului: buton, titlu, comutator, căutare, tastă de tastatură, valoare modificabilă, link și altele.
let profileButton = UIButton(type: .custom)
profileButton.setImage(UIImage(named: "avatar"), for: .normal)
profileButton.isAccessibilityElement = true
profileButton.accessibilityLabel = "Profil utilizator"
profileButton.accessibilityTraits = .button
profileButton.accessibilityHint = "Deschide ecranul de setări al profilului"
Indicatorul isAccessibilityElement activează suportul VoiceOver pentru vizualizări personalizate — implicit este true doar pentru elementele standard (UIButton, UILabel, UITextField). Parametrul accessibilityHint adaugă o sugestie: VoiceOver o pronunță după o pauză, dacă utilizatorul se oprește asupra elementului. Hint trebuie să descrie rezultatul acțiunii, nu instrucțiunea: „Deschide ecranul de setări" în loc de „Apăsați pentru a deschide".
Pentru ecrane complexe, unde grupul logic de elemente nu corespunde ordinii vizuale, se folosește accessibilityElements — un tablou care stabilește ordinea de citire. De exemplu, cardul unui produs conține imaginea, numele, prețul și butonul „În coș". Dacă aceste elemente sunt dispuse haotic în ierarhia vizualizărilor, accessibilityElements stabilește ordinea corectă pentru VoiceOver.
let productCard = UIView()
let productImage = UIImageView()
let productName = UILabel()
let productPrice = UILabel()
let addToCartButton = UIButton()
productCard.accessibilityElements = [
productImage, productName, productPrice, addToCartButton
]
Pentru combinarea mai multor elemente într-un singur element accesibil se folosește UIAccessibilityContainer sau accessibilityFrame pentru suprascrierea zonei de atingere. Acest lucru este util atunci când o celulă de tabel conține mai multe componente UI, dar logic reprezintă un singur element — VoiceOver trebuie să vocalizeze întreaga celulă ca un întreg, nu să-i parcurgă conținutul separat.
Configurarea corectă a accesibilității pentru VoiceOver necesită atenție la mai multe aspecte: marcarea semantică, actualizări dinamice, gestionarea elementelor personalizate și testarea cu un screen reader real.
În SwiftUI, accesibilitatea se configurează prin modificatorii .accessibilityLabel(), .accessibilityValue(), .accessibilityHint() și .accessibilityAddTraits(). SwiftUI moștenește automat accesibilitatea din elementele standard, dar pentru componentele personalizate este necesară configurarea explicită. De exemplu, un glisor personalizat trebuie să informeze VoiceOver despre valoarea și formatul său de modificare.
Slider(value: $volume, in: 0...100)
.accessibilityLabel("Volum sunet")
.accessibilityValue(
Text("\(Int(volume)) procente")
)
.accessibilityAddTraits(.adjustsAudioForAccessibility)
.accessibilityAdjustableAction { direction in
switch direction {
case .increment: volume = min(volume + 5, 100)
case .decrement: volume = max(volume - 5, 0)
}
}
Modificatorul accessibilityAdjustableAction adaugă posibilitatea de a modifica valoarea prin gesturi VoiceOver: glisare în sus — creștere, glisare în jos — descreștere. Fără acest modificator, glisorul rămâne inaccesibil pentru controlul prin screen reader. O configurare similară este necesară pentru stepper-e, picker-e și alte elemente care își modifică valoarea.
Când conținutul de pe ecran se modifică dinamic (a apărut o notificare, s-a actualizat starea de încărcare, s-a modificat prețul), VoiceOver trebuie să primească o notificare prin UIAccessibility.post. Fără acest apel, screen reader-ul nu va afla despre modificări, iar utilizatorul va rata informații importante. Pentru SwiftUI se folosește modificatorul .accessibilityAnnouncement().
UIAccessibility.post(
notification: .announcement,
argument: "Prețul redus cu 20 de procente"
)
// SwiftUI
Text("Preț actualizat")
.accessibilityAnnouncement(Text("Reducere 20%"))
Notificările VoiceOver trebuie folosite cu discernământ: anunțurile excesive irită utilizatorul, iar absența lor face aplicația inaccesibilă. Strategia optimă — anunțați doar modificările care afectează fluxul de lucru curent al utilizatorului: actualizarea coșului, starea de încărcare, eroarea de validare a formularului, notificarea chat-ului. Modificările de fundal (ora pe bara de stare, cursul valutar) nu necesită anunțare — utilizatorul le va verifica singur la nevoie.
Testarea VoiceOver se efectuează printr-un dispozitiv fizic cu screen reader-ul activat sau simulatorul iOS cu opțiunea Accessibility Inspector. Este important să verificați scenarii complete de utilizare: fără control vizual să treceți prin înregistrare, să plasați o comandă, să găsiți un produs prin căutare. Dacă traseul este parcurs fără feedback vizual — VoiceOver este configurat corect.
Întrebări frecvente
Setări → Accesibilitate → VoiceOver. Activați comutatorul. Pentru activarea rapidă se folosește apăsarea triplă a butonului lateral (pe iPhone X și mai noi) sau a butonului Home. Siri poate activa și el VoiceOver prin comanda „Activează VoiceOver".
VoiceOver — cititorul de ecran Apple pentru iOS, TalkBack — cititorul de ecran Google pentru Android. Principiul de funcționare este același: atingerea vocalizează, atingerea dublă activează. Diferența constă în gesturi, setările rotorului și integrările ecosistemice: VoiceOver este mai profund integrat cu iCloud și Apple Pay.
Utilizați API-ul UIAccessibility: setați accessibilityLabel pentru toate elementele, accessibilityTraits pentru tipul elementului și accessibilityHint pentru sugestii. În SwiftUI aplicați modificatorii .accessibilityLabel() și .accessibilityAddTraits(). Testați aplicația cu VoiceOver activat.
Rotorul — este modul de navigare comutat prin rotirea a două degete. Determină cum să vă deplasați între elemente: după titluri, caractere, cuvinte, linkuri sau puncte de intrare. Dezvoltatorii pot adăuga propriile moduri prin UIAccessibilityCustomRotor.
Pentru UIView-uri personalizate trebuie să setați isAccessibilityElement = true și să specificați accessibilityLabel. Dacă elementul constă din mai multe vizualizări copil, utilizați accessibilityElements pentru a stabili ordinea de citire sau combinați-le într-un container.
Concluzii
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.
Citiți și