VoiceOver — je vestavěný hlasový výstup (screen reader) od Apple, který vyslovuje každý prvek rozhraní a umožňuje ovládat zařízení pomocí gest. Tato technologie je zabudována do iOS, iPadOS a macOS na systémové úrovni a nevyžaduje instalaci dalšího softwaru. Podle Apple Accessibility (2025) podporuje VoiceOver více než 40 jazyků a používají ho miliony nevidomých a slabozrakých uživatelů po celém světě.
Hlavní body
VoiceOver — je hlasový výstup (screen reader) vestavěný do operačních systémů Apple. Je určen pro nevidomé a slabozraké uživatele a poskytuje plnohodnotnou interakci se zařízením bez vizuálního kontaktu. VoiceOver vyslovuje všechny prvky rozhraní: tlačítka, odkazy, text, obrázky, oznámení a systémové prvky.
Tato technologie byla poprvé představena v roce 2005 pro macOS a na iOS se objevila s iPhone 3GS v roce 2009. Od té doby se VoiceOver stal nedílnou součástí ekosystému Apple a jedním z hlavních argumentů pro přístupnost platformy. VoiceOver je zabudován na systémové úrovni — to znamená, že funguje v jakékoli aplikaci bez dodatečné integrace ze strany vývojáře, i když kvalita hlasového výstupu přímo závisí na tom, jak dobře aplikace využívá API přístupnosti iOS.
VoiceOver podporuje více než 40 jazyků s přirozenou syntézou řeči a přizpůsobuje se regionálním nastavením hlasu. Na iOS VoiceOver využívá hlasové engine Siri pro češtinu a další jazyky, což zajišťuje co nejpřirozenější zvuk a správnou intonaci v závislosti na interpunkci a kontextu.
VoiceOver zachycuje události dotyku a interpretuje je jinak než standardní vstup iOS. Když uživatel dotkne obrazovky, VoiceOver neaktivuje prvek pod prstem, ale nejprve jej vysloví. Teprve po dvojitém dotyku se prvek aktivuje. To je klíčový rozdíl, který umožňuje nevidomým uživatelům prozkoumávat rozhraní bez rizika náhodného stisknutí.
VoiceOver čte prvky rozhraní v logickém pořadí: zleva doprava, shora dolů. Pořadí čtení se dědí z hierarchie zobrazení iOS, ale vývojář jej může změnit pomocí vlastnosti accessibilityElements pro složitá rozvržení. Uživatel se může pohybovat mezi prvky přejetím doprava (další) a doleva (předchozí) a také dotykem konkrétního prvku pro jeho vyslovení.
Při každém přesunu VoiceOver vysloví typ prvku (tlačítko, odkaz, nadpis), jeho název (accessibilityLabel), stav (vybráno, vypnuto) a nápovědu (accessibilityHint). Pokud prvek obsahuje hodnotu — například posuvník hlasitosti — VoiceOver vysloví i ji. Vlastnosti přístupnosti (UIAccessibilityTraits) dále informují uživatele o chování prvku: zda se jedná o tlačítko, přepínač, vyhledávání nebo klávesu klávesnice.
Rotor — je virtuální ovládací knoflík, který přepíná režim navigace VoiceOver. Uživatel otáčí rotorem dvěma prsty (jako knoflíkem hlasitosti) a vybírá režim: slova, znaky, nadpisy, odkazy, vstupní body, řádky tabulky a další. Režim nadpisů umožňuje rychlé přepínání mezi H1-H6 na webových stránkách a v aplikacích, a režim znaků — vyslovování textu písmeno po písmeni, což je užitečné při vyplňování formulářů nebo zadávání potvrzovacích kódů.
Vývojář může přidávat vlastní režimy do rotoru pomocí API UIAccessibilityCustomRotor. Například v aplikaci na poznámky lze přidat rotor „Oblíbené poznámky" nebo „Poslední změny". Vlastní rotory výrazně urychlují navigaci ve specifických aplikacích a jsou považovány za nejlepší praxi přístupnosti na iOS.
VoiceOver používá vlastní sadu gest, která se neshodují se standardními gesty iOS. Většina gest se provádí třemi prsty místo jednoho — to zabraňuje konfliktům s běžným ovládáním a umožňuje VoiceOver pracovat současně se standardním vstupem.
| Akce | Gesto | Výsledek |
|---|---|---|
| Vyslovit prvek | Dotek 1 prstem | Vysloví název prvku |
| Aktivovat | Dvojitý dotek | Stisknutí tlačítka nebo odkazu |
| Další prvek | Přejetí doprava | Přechod na další |
| Předchozí prvek | Přejetí doleva | Návrat k předchozímu |
| Posouvání | 3 prsty přejetí | Posouvání seznamu nebo stránky |
| Rotor | 2 prsty otáčení | Změna režimu navigace |
Gesto dvojitý dotek je hlavním způsobem aktivace prvků ve VoiceOver. Pokud prvek vyžaduje speciální akci (například přetažení), VoiceOver použije sekvenci „dotek — dvojitý dotek a podržení" pro vstup do režimu přesouvání. To umožňuje provádět složitá gesta, jako je drag-and-drop, bez pohledu na obrazovku. VoiceOver také podporuje gesto „dvojitý dotek dvěma prsty" pro zrušení akce a „trojitý dotek" pro zapnutí/vypnutí závěsu obrazovky (Screen Curtain).
Vývojář iOS aplikace může výrazně zlepšit interakci s VoiceOver prostřednictvím API UIAccessibility. Základní nastavení přístupnosti se přidávají v Interface Builder (Identity Inspector → Accessibility), ale pro složitá rozhraní je vyžadováno programové nastavení v kódu.
Vlastnost accessibilityLabel nastavuje text, který VoiceOver vysloví pro prvek. Pokud štítek není nastaven, VoiceOver použije text tlačítka nebo placeholder textového pole. Pro prvky bez textu (ikony, vlastní zobrazení) je štítek povinný. Vlastnost accessibilityTraits určuje typ prvku: tlačítko, nadpis, přepínač, vyhledávání, klávesa klávesnice, měnící se hodnota, odkaz a další.
let profileButton = UIButton(type: .custom)
profileButton.setImage(UIImage(named: "avatar"), for: .normal)
profileButton.isAccessibilityElement = true
profileButton.accessibilityLabel = "Uživatelský profil"
profileButton.accessibilityTraits = .button
profileButton.accessibilityHint = "Otevírá obrazovku nastavení profilu"
Příznak isAccessibilityElement zapíná podporu VoiceOver pro vlastní zobrazení — ve výchozím nastavení je true pouze pro standardní prvky (UIButton, UILabel, UITextField). Parametr accessibilityHint přidává nápovědu: VoiceOver ji vysloví po pauze, pokud uživatel zastaví na prvku. Hint by měl popisovat výsledek akce, nikoli instrukci: „Otevře obrazovku nastavení" místo „Stiskněte pro otevření".
Pro složité obrazovky, kde logická skupina prvků neodpovídá vizuálnímu pořadí, se používá accessibilityElements — pole, které nastavuje pořadí čtení. Například karta produktu obsahuje obrázek, název, cenu a tlačítko „Do košíku". Pokud jsou tyto prvky chaoticky rozmístěny v hierarchii zobrazení, accessibilityElements nastaví správné pořadí pro VoiceOver.
let productCard = UIView()
let productImage = UIImageView()
let productName = UILabel()
let productPrice = UILabel()
let addToCartButton = UIButton()
productCard.accessibilityElements = [
productImage, productName, productPrice, addToCartButton
]
Pro sloučení více prvků do jednoho přístupného prvku se používá UIAccessibilityContainer nebo accessibilityFrame pro přepsání oblasti dotyku. To je užitečné, když buňka tabulky obsahuje několik komponent UI, ale logicky představuje jeden prvek — VoiceOver by měl vyslovit celou buňku jako celek, ne procházet její obsah samostatně.
Správné nastavení přístupnosti pro VoiceOver vyžaduje pozornost k několika aspektům: sémantické značení, dynamické aktualizace, zpracování vlastních prvků a testování se skutečným screen readerem.
Ve SwiftUI se přístupnost nastavuje pomocí modifikátorů .accessibilityLabel(), .accessibilityValue(), .accessibilityHint() a .accessibilityAddTraits(). SwiftUI automaticky dědí přístupnost ze standardních prvků, ale pro vlastní komponenty je vyžadováno explicitní nastavení. Například vlastní posuvník musí informovat VoiceOver o své hodnotě a formátu změny.
Slider(value: $volume, in: 0...100)
.accessibilityLabel("Hlasitost zvuku")
.accessibilityValue(
Text("\(Int(volume)) procent")
)
.accessibilityAddTraits(.adjustsAudioForAccessibility)
.accessibilityAdjustableAction { direction in
switch direction {
case .increment: volume = min(volume + 5, 100)
case .decrement: volume = max(volume - 5, 0)
}
}
Modifikátor accessibilityAdjustableAction přidává možnost změny hodnoty gesty VoiceOver: přejetí nahoru — zvýšení, přejetí dolů — snížení. Bez tohoto modifikátoru zůstane posuvník nepřístupný pro ovládání přes screen reader. Podobné nastavení je vyžadováno pro vlastní steppery, pickery a další prvky měnící svou hodnotu.
Když se obsah na obrazovce dynamicky mění (objevilo se oznámení, aktualizoval se stav načítání, změnila se cena), VoiceOver by měl obdržet oznámení prostřednictvím UIAccessibility.post. Bez tohoto volání se screen reader nedozví o změnách a uživatel zmešká důležité informace. Pro SwiftUI se používá modifikátor .accessibilityAnnouncement().
UIAccessibility.post(
notification: .announcement,
argument: "Cena snížena o 20 procent"
)
// SwiftUI
Text("Cena aktualizována")
.accessibilityAnnouncement(Text("Sleva 20%"))
Oznámení VoiceOver by měla být používána s rozumem: nadměrná hlášení uživatele obtěžují, a jejich absence činí aplikaci nepřístupnou. Optimální strategie — oznamovat pouze změny, které ovlivňují aktuální pracovní tok uživatele: aktualizace košíku, stav načítání, chyba validace formuláře, oznámení chatu. Změny na pozadí (čas na liště, kurz měny) nevyžadují oznámení — uživatel je v případě potřeby zkontroluje sám.
Testování VoiceOver se provádí pomocí fyzického zařízení s zapnutým screen readerem nebo iOS simulátoru s možností Accessibility Inspector. Je důležité otestovat scénáře plného použití: bez vizuální kontroly projít registrací, objednat, najít produkt vyhledáváním. Pokud je cesta průchozí bez vizuální zpětné vazby — VoiceOver je nastaven správně.
Často kladené dotazy
Nastavení → Přístupnost → VoiceOver. Zapněte přepínač. Pro rychlé zapnutí se používá trojité stisknutí bočního tlačítka (na iPhone X a novějších) nebo tlačítka Domů. Siri také může zapnout VoiceOver příkazem „Zapni VoiceOver".
VoiceOver — Apple hlasový výstup pro iOS, TalkBack — Google hlasový výstup pro Android. Princip fungování je stejný: dotek vysloví, dvojitý dotek aktivuje. Rozdíl je v gestech, nastavení rotoru a ekosystémových integracích: VoiceOver je hlouběji integrován s iCloud a Apple Pay.
Použijte API UIAccessibility: nastavte accessibilityLabel pro všechny prvky, accessibilityTraits pro typ prvku a accessibilityHint pro nápovědy. Ve SwiftUI aplikujte modifikátory .accessibilityLabel() a .accessibilityAddTraits(). Testujte aplikaci se zapnutým VoiceOver.
Rotor — je režim navigace přepínaný otáčením dvou prstů. Určuje, jak se pohybovat mezi prvky: podle nadpisů, znaků, slov, odkazů nebo vstupních bodů. Vývojáři mohou přidat vlastní režimy prostřednictvím UIAccessibilityCustomRotor.
Pro vlastní UIView je nutné nastavit isAccessibilityElement = true a zadat accessibilityLabel. Pokud se prvek skládá z několika podřízených zobrazení, použijte accessibilityElements pro určení pořadí čtení nebo je spojte do kontejneru.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také