VoiceOver: co to jest, gesty sterowania i możliwości na iOS

Autor: IT Sectr Opublikowano: 2026-05-15 Czas czytania: 8 min

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 — wbudowany screen reader na iOS, iPadOS i macOS, sterowany gestami i głosem
  • Rotor VoiceOver przełącza tryby nawigacji: słowa, znaki, nagłówki, linki
  • Gesty obejmują dotknięcie (odczytanie), przesunięcie (przejście) i podwójne dotknięcie (aktywacja)
  • Deweloperzy konfigurują dostępność przez UIAccessibility i Accessibility Label
  • VoiceOver integruje się z dynamicznym tekstem i wyświetlaczami brajlowskimi

Czym jest VoiceOver?

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.

Jak działa VoiceOver?

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.

Kolejność czytania i nawigacja

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 VoiceOver

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.

Gesty sterowania VoiceOver

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śćGestRezultat
Odczytaj elementDotknięcie 1 palcemWymawia nazwę elementu
AktywujPodwójne dotknięcieNaciśnięcie przycisku lub linku
Następny elementPrzesunięcie w prawoPrzejście do następnego
Poprzedni elementPrzesunięcie w lewoPowrót do poprzedniego
Przewijanie3 palce przesunięciePrzewijanie listy lub strony
Rotor2 palce obrótZmiana 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).

VoiceOver w programowaniu mobilnym

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.

Accessibility Label i Traits

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.

swift
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ć”.

Grupowanie i kolejność elementów

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.

swift
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.

Konfiguracja dostępności dla VoiceOver

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.

Semantyczne znaczniki w SwiftUI

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.

swift
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ść.

Dynamiczne aktualizacje i powiadomienia

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().

swift
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

Jak włączyć VoiceOver na iPhone?

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”.

Czym VoiceOver różni się od TalkBack?

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.

Jak skonfigurować VoiceOver dla swojej aplikacji?

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.

Czym jest rotor w 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.

Dlaczego VoiceOver nie odczytuje mojego niestandardowego elementu?

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

  • VoiceOver — wbudowany screen reader Apple dla iOS, iPadOS i macOS ze sterowaniem głosowym i gestami
  • Rotor przełącza tryby nawigacji: nagłówki, znaki, słowa, linki i tryby niestandardowe
  • Gesty VoiceOver: dotknięcie — odczytanie, podwójne dotknięcie — aktywacja, przesunięcie — nawigacja
  • Programowanie przez API UIAccessibility: label, traits, hint, custom rotor i dynamiczne powiadomienia
  • SwiftUI udostępnia modyfikatory .accessibilityLabel(), .accessibilityAddTraits() i .accessibilityAdjustableAction()
  • Dynamiczne aktualizacje wymagają wywołania UIAccessibility.post w celu powiadomienia VoiceOver
  • Testowanie obowiązkowo na rzeczywistym urządzeniu z włączonym VoiceOver bez kontroli wzrokowej

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.

Omów projekt

Przeczytaj również