VoiceOver — wbudowany narrator ekranowy (screen reader) firmy Apple, który odczytuje na głos każdy element interfejsu i umożliwia sterowanie urządzeniem za pomocą gestów. Technologia jest wbudowana w systemy iOS, iPadOS i macOS na poziomie systemowym i nie wymaga instalacji dodatkowego oprogramowania. Według danych Apple Accessibility (2025), VoiceOver obsługuje ponad 40 języków i jest używany przez miliony niewidomych i słabowidzących użytkowników na całym świecie.
Najważniejsze
VoiceOver — to narrator ekranowy (screen reader) wbudowany w systemy operacyjne Apple. Jest przeznaczony dla niewidomych i słabowidzących użytkowników i zapewnia pełną interakcję z urządzeniem bez kontaktu wzrokowego. VoiceOver odczytuje wszystkie elementy interfejsu: przyciski, linki, tekst, obrazy, powiadomienia i elementy systemowe.
Technologia została po raz pierwszy zaprezentowana w 2005 roku dla macOS, a na iOS pojawiła się wraz z iPhone 3GS w 2009 roku. Od tego czasu VoiceOver stał się nieodłączną częścią ekosystemu Apple i jednym z głównych argumentów za dostępnością platformy. VoiceOver jest wbudowany na poziomie systemowym — oznacza to, że działa w każdej aplikacji bez dodatkowej integracji ze strony dewelopera, choć jakość odczytu zależy bezpośrednio od tego, jak dobrze aplikacja wykorzystuje API dostępności iOS.
VoiceOver obsługuje ponad 40 języków z naturalną syntezą mowy i dostosowuje się do regionalnych ustawień głosu. Na iOS VoiceOver wykorzystuje silniki głosowe Siri dla języka polskiego i innych języków, co zapewnia maksymalnie naturalne brzmienie i prawidłową intonację w zależności od interpunkcji i kontekstu.
VoiceOver przechwytuje zdarzenia dotknięcia i interpretuje je inaczej niż standardowe wejście iOS. Gdy użytkownik dotyka ekranu, VoiceOver nie aktywuje elementu pod palcem, ale najpierw go odczytuje. Dopiero po podwójnym dotknięciu element zostaje aktywowany. To kluczowa różnica, która pozwala niewidomym użytkownikom eksplorować interfejs bez ryzyka przypadkowego naciśnięcia.
VoiceOver odczytuje elementy interfejsu w logicznej kolejności: od lewej do prawej, od góry do dołu. Kolejność czytania jest dziedziczona z hierarchii widoków iOS, ale deweloper może ją zmienić za pomocą właściwości accessibilityElements w przypadku złożonych układów. Użytkownik może poruszać się między elementami, przesuwając palcem w prawo (następny) i w lewo (poprzedni), a także dotykając konkretnego elementu, aby go odsłuchać.
Przy każdym przejściu VoiceOver wymawia typ elementu (przycisk, link, nagłówek), jego nazwę (accessibilityLabel), stan (zaznaczony, wyłączony) i podpowiedź (accessibilityHint). Jeśli element zawiera wartość — na przykład suwak głośności — VoiceOver odczytuje również ją. Accessibility Traits (UIAccessibilityTraits) dodatkowo informują użytkownika o zachowaniu elementu: czy jest przyciskiem, przełącznikiem, wyszukiwarką czy klawiszem klawiatury.
Rotor — to wirtualne pokrętło regulacji, które przełącza tryb nawigacji VoiceOver. Użytkownik obraca rotor dwoma palcami (jak pokrętło głośności) i wybiera tryb: słowa, znaki, nagłówki, linki, punkty wejścia, wiersze tabeli i inne. Tryb nagłówków umożliwia szybkie przełączanie między H1-H6 na stronach internetowych i w aplikacjach, a tryb znaków — wymawianie tekstu litera po literze, co jest przydatne przy wypełnianiu formularzy lub wprowadzaniu kodów potwierdzających.
Deweloper może dodawać własne tryby do rotora za pomocą API UIAccessibilityCustomRotor. Na przykład w aplikacji do notatek można dodać rotor „Ulubione notatki” lub „Ostatnie zmiany”. Niestandardowe rotory znacznie przyspieszają nawigację w specyficznych aplikacjach i są uważane za najlepszą praktykę accessibility na iOS.
VoiceOver używa własnego zestawu gestów, które nie pokrywają się ze standardowymi gestami iOS. Większość gestów wykonuje się trzema palcami zamiast jednym — zapobiega to konfliktom ze zwykłym sterowaniem i pozwala VoiceOver działać jednocześnie ze standardowym wprowadzaniem.
| Czynność | Gest | Rezultat |
|---|---|---|
| Odczytaj element | Dotknięcie 1 palcem | Wymawia nazwę elementu |
| Aktywuj | Podwójne dotknięcie | Naciśnięcie przycisku lub linku |
| Następny element | Przesunięcie w prawo | Przejście do następnego |
| Poprzedni element | Przesunięcie w lewo | Powrót do poprzedniego |
| Przewijanie | 3 palce przesunięcie | Przewijanie listy lub strony |
| Rotor | 2 palce obrót | Zmiana trybu nawigacji |
Gest podwójne dotknięcie jest podstawowym sposobem aktywacji elementów w VoiceOver. Jeśli element wymaga specjalnej czynności (na przykład przeciągnięcia), VoiceOver używa sekwencji „dotknięcie — podwójne dotknięcie i przytrzymanie”, aby wejść w tryb przenoszenia. Umożliwia to wykonywanie złożonych gestów, takich jak drag-and-drop, bez patrzenia na ekran. VoiceOver obsługuje również gest „podwójne dotknięcie dwoma palcami” w celu anulowania czynności oraz „potrójne dotknięcie” w celu włączenia/wyłączenia zasłony ekranowej (Screen Curtain).
Deweloper aplikacji iOS może znacznie poprawić interakcję z VoiceOver za pomocą API UIAccessibility. Podstawowe ustawienia dostępności dodaje się w Interface Builder (Identity Inspector → Accessibility), ale w przypadku złożonych interfejsów wymagane jest programowe konfigurowanie w kodzie.
Właściwość accessibilityLabel określa tekst, który VoiceOver wymawia dla elementu. Jeśli etykieta nie jest ustawiona, VoiceOver używa tekstu przycisku lub placeholdera pola tekstowego. Dla elementów bez tekstu (ikon, niestandardowych widoków) etykieta jest obowiązkowa. Właściwość accessibilityTraits określa typ elementu: przycisk, nagłówek, przełącznik, wyszukiwarka, klawisz klawiatury, wartość zmieniana, link i inne.
let profileButton = UIButton(type: .custom)
profileButton.setImage(UIImage(named: "avatar"), for: .normal)
profileButton.isAccessibilityElement = true
profileButton.accessibilityLabel = "Profil użytkownika"
profileButton.accessibilityTraits = .button
profileButton.accessibilityHint = "Otwiera ekran ustawień profilu"
Flaga isAccessibilityElement włącza obsługę VoiceOver dla niestandardowych widoków — domyślnie jest równa true tylko dla standardowych elementów (UIButton, UILabel, UITextField). Parametr accessibilityHint dodaje podpowiedź: VoiceOver wymawia ją po pauzie, jeśli użytkownik zatrzyma się na elemencie. Hint powinien opisywać rezultat czynności, a nie instrukcję: „Otwiera ekran ustawień” zamiast „Naciśnij, aby otworzyć”.
W przypadku złożonych ekranów, gdzie logiczna grupa elementów nie odpowiada wizualnej kolejności, używa się accessibilityElements — tablicy określającej kolejność czytania. Na przykład karta produktu zawiera obraz, nazwę, cenę i przycisk „Do koszyka”. Jeśli te elementy są rozmieszczone chaotycznie w hierarchii widoków, accessibilityElements ustala prawidłową kolejność dla VoiceOver.
let productCard = UIView()
let productImage = UIImageView()
let productName = UILabel()
let productPrice = UILabel()
let addToCartButton = UIButton()
productCard.accessibilityElements = [
productImage, productName, productPrice, addToCartButton
]
Do łączenia wielu elementów w jeden dostępny element używa się UIAccessibilityContainer lub accessibilityFrame do nadpisania obszaru dotknięcia. Jest to przydatne, gdy komórka tabeli zawiera kilka komponentów UI, ale logicznie stanowi jeden element — VoiceOver powinien odczytać całą komórkę jako całość, a nie przeglądać jej zawartość osobno.
Prawidłowa konfiguracja dostępności dla VoiceOver wymaga uwagi na kilka aspektów: semantyczne znaczniki, dynamiczne aktualizacje, obsługa niestandardowych elementów i testowanie z rzeczywistym screen readerem.
W SwiftUI dostępność konfiguruje się za pomocą modyfikatorów .accessibilityLabel(), .accessibilityValue(), .accessibilityHint() i .accessibilityAddTraits(). SwiftUI automatycznie dziedziczy dostępność ze standardowych elementów, ale w przypadku niestandardowych komponentów wymagana jest jawna konfiguracja. Na przykład niestandardowy suwak powinien informować VoiceOver o swojej wartości i formacie zmiany.
Slider(value: $volume, in: 0...100)
.accessibilityLabel("Głośność dźwięku")
.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)
}
}
Modyfikator accessibilityAdjustableAction dodaje możliwość zmiany wartości za pomocą gestów VoiceOver: przesunięcie w górę — zwiększ, przesunięcie w dół — zmniejsz. Bez tego modyfikatora suwak pozostanie niedostępny do sterowania przez screen reader. Podobna konfiguracja jest wymagana dla niestandardowych stepperów, pickerów i innych elementów zmieniających swoją wartość.
Gdy zawartość na ekranie zmienia się dynamicznie (pojawiło się powiadomienie, zaktualizował się status ładowania, zmieniła się cena), VoiceOver powinien otrzymać powiadomienie przez UIAccessibility.post. Bez tego wywołania screen reader nie dowie się o zmianach, a użytkownik przegapi ważne informacje. Dla SwiftUI używa się modyfikatora .accessibilityAnnouncement().
UIAccessibility.post(
notification: .announcement,
argument: "Cena obniżona o 20 procent"
)
// SwiftUI
Text("Cena zaktualizowana")
.accessibilityAnnouncement(Text("Rabat 20%"))
Powiadomienia VoiceOver należy używać rozsądnie: nadmierne komunikaty irytują użytkownika, a ich brak czyni aplikację niedostępną. Optymalna strategia — ogłaszać tylko te zmiany, które wpływają na bieżący przepływ pracy użytkownika: aktualizacja koszyka, status ładowania, błąd walidacji formularza, powiadomienie czatu. Zmiany w tle (czas na pasku, kurs walut) nie wymagają ogłaszania — użytkownik sam je sprawdzi w razie potrzeby.
Testowanie VoiceOver wykonuje się przez fizyczne urządzenie z włączonym screen readerem lub symulator iOS z opcją Accessibility Inspector. Ważne jest przetestowanie scenariuszy pełnego użytkowania: bez kontroli wzrokowej przejść rejestrację, złożyć zamówienie, znaleźć produkt przez wyszukiwarkę. Jeśli ścieżka jest przejezdna bez informacji zwrotnej wizualnej — VoiceOver jest skonfigurowany prawidłowo.
Często zadawane pytania
Ustawienia → Dostępność → VoiceOver. Włącz przełącznik. Do szybkiego włączenia używa się potrójnego naciśnięcia przycisku bocznego (w iPhone X i nowszych) lub przycisku Dom. Siri może również włączyć VoiceOver na komendę „Włącz VoiceOver”.
VoiceOver — narrator ekranowy Apple dla iOS, TalkBack — narrator ekranowy Google dla Androida. Zasada działania jest taka sama: dotknięcie odczytuje, podwójne dotknięcie aktywuje. Różnica polega na gestach, ustawieniach rotora i integracjach ekosystemowych: VoiceOver jest głębiej zintegrowany z iCloud i Apple Pay.
Użyj API UIAccessibility: ustaw accessibilityLabel dla wszystkich elementów, accessibilityTraits dla typu elementu i accessibilityHint dla podpowiedzi. W SwiftUI stosuj modyfikatory .accessibilityLabel() i .accessibilityAddTraits(). Testuj aplikację z włączonym VoiceOver.
Rotor — tryb nawigacji przełączany obrotem dwóch palców. Określa, jak poruszać się między elementami: według nagłówków, znaków, słów, linków lub punktów wejścia. Deweloperzy mogą dodać własne tryby przez UIAccessibilityCustomRotor.
Dla niestandardowych UIView należy ustawić isAccessibilityElement = true i określić accessibilityLabel. Jeśli element składa się z kilku widoków potomnych, użyj accessibilityElements do określenia kolejności czytania lub połącz je w kontener.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również