VoiceOver — встроенный экранный диктор (screen reader) от Apple, который озвучивает каждый элемент интерфейса и позволяет управлять устройством с помощью жестов. Технология встроена в iOS, iPadOS и macOS на системном уровне и не требует установки дополнительного ПО. По данным Apple Accessibility (2025), VoiceOver поддерживает более 40 языков и используется миллионами незрячих и слабовидящих пользователей по всему миру.
Главное
VoiceOver — это экранный диктор (screen reader), встроенный в операционные системы Apple. Он предназначен для незрячих и слабовидящих пользователей и обеспечивает полноценное взаимодействие с устройством без визуального контакта. VoiceOver озвучивает все элементы интерфейса: кнопки, ссылки, текст, изображения, уведомления и системные элементы.
Технология была впервые представлена в 2005 году для macOS, а на iOS появилась вместе с iPhone 3GS в 2009 году. С тех пор VoiceOver стал неотъемлемой частью экосистемы Apple и одним из главных аргументов в пользу доступности платформы. VoiceOver встроен на системном уровне — это значит, что он работает в любом приложении без дополнительной интеграции со стороны разработчика, хотя качество озвучивания напрямую зависит от того, насколько хорошо приложение использует API доступности iOS.
VoiceOver поддерживает более 40 языков с естественным синтезом речи и адаптируется под региональные настройки голоса. На iOS VoiceOver использует голосовые движки Siri для русского и ряда других языков, что обеспечивает максимально естественное звучание и правильную интонацию в зависимости от пунктуации и контекста.
VoiceOver перехватывает события касания и интерпретирует их иначе, чем стандартный ввод iOS. Когда пользователь касается экрана, VoiceOver не активирует элемент под пальцем, а сначала озвучивает его. Только после двойного касания элемент активируется. Это ключевое отличие, которое позволяет незрячим пользователям исследовать интерфейс без риска случайного нажатия.
VoiceOver читает элементы интерфейса в логическом порядке: слева направо, сверху вниз. Порядок чтения наследуется из иерархии представлений iOS, но разработчик может изменить его через свойство accessibilityElements для сложных макетов. Пользователь может перемещаться между элементами свайпом вправо (следующий) и влево (предыдущий), а также касаться конкретного элемента для его озвучивания.
При каждом перемещении VoiceOver произносит тип элемента (кнопка, ссылка, заголовок), его название (accessibilityLabel), состояние (выбрано, отключено) и подсказку (accessibilityHint). Если элемент содержит значение — например, ползунок громкости — VoiceOver озвучивает и его. Accessibility Traits (UIAccessibilityTraits) дополнительно сообщают пользователю о поведении элемента: является ли он кнопкой, переключателем, поиском или клавишей клавиатуры.
Ротор — это виртуальная ручка настройки, которая переключает режим навигации VoiceOver. Пользователь вращает ротор двумя пальцами (как ручку громкости) и выбирает режим: слова, символы, заголовки, ссылки, точки входа, строки таблицы и другие. Режим заголовков позволяет быстро переключаться между H1-H6 на веб-страницах и в приложениях, а режим символов — произносить текст по буквам, что полезно при заполнении форм или вводе кодов подтверждения.
Разработчик может добавлять собственные режимы в ротор через API UIAccessibilityCustomRotor. Например, в приложении для заметок можно добавить ротор «Избранные заметки» или «Последние изменения». Кастомные роторы значительно ускоряют навигацию в специфических приложениях и считаются лучшей практикой accessibility на iOS.
VoiceOver использует собственный набор жестов, которые не совпадают со стандартными жестами iOS. Большинство жестов выполняется тремя пальцами вместо одного — это предотвращает конфликты с обычным управлением и позволяет VoiceOver работать одновременно со стандартным вводом.
| Действие | Жест | Результат |
|---|---|---|
| Озвучить элемент | Касание 1 пальцем | Произносит название элемента |
| Активировать | Двойное касание | Нажатие кнопки или ссылки |
| Следующий элемент | Свайп вправо | Переход к следующему |
| Предыдущий элемент | Свайп влево | Возврат к предыдущему |
| Прокрутка | 3 пальца свайп | Прокрутка списка или страницы |
| Ротор | 2 пальца вращение | Смена режима навигации |
Жест двойное касание является основным способом активации элементов в VoiceOver. Если элемент требует специального действия (например, перетаскивание), VoiceOver использует последовательность «касание — двойное касание и удержание» для входа в режим перемещения. Это позволяет выполнять сложные жесты, такие как drag-and-drop, не видя экран. VoiceOver также поддерживает жест «двойное касание двумя пальцами» для отмены действия и «тройное касание» для включения/выключения экранной шторки (Screen Curtain).
Разработчик iOS-приложения может значительно улучшить взаимодействие с VoiceOver через API UIAccessibility. Базовые настройки доступности добавляются в Interface Builder (Identity Inspector → Accessibility), но для сложных интерфейсов требуется программная настройка в коде.
Свойство accessibilityLabel задаёт текст, который VoiceOver произносит для элемента. Если label не задан, VoiceOver использует текст кнопки или placeholder текстового поля. Для элементов без текста (иконок, кастомных view) label обязателен. Свойство accessibilityTraits определяет тип элемента: кнопка, заголовок, переключатель, поиск, клавиша клавиатуры, значение изменяется, ссылка и другие.
let profileButton = UIButton(type: .custom)
profileButton.setImage(UIImage(named: "avatar"), for: .normal)
profileButton.isAccessibilityElement = true
profileButton.accessibilityLabel = "Профиль пользователя"
profileButton.accessibilityTraits = .button
profileButton.accessibilityHint = "Открывает экран настроек профиля"
Флаг isAccessibilityElement включает поддержку VoiceOver для кастомных view — по умолчанию он равен true только для стандартных элементов (UIButton, UILabel, UITextField). Параметр accessibilityHint добавляет подсказку: VoiceOver произносит её после паузы, если пользователь задерживается на элементе. Hint должен описывать результат действия, а не инструкцию: «Открывает экран настроек» вместо «Нажмите, чтобы открыть».
Для сложных экранов, где логическая группа элементов не соответствует визуальному порядку, используется accessibilityElements — массив, задающий порядок чтения. Например, карточка товара содержит изображение, название, цену и кнопку «В корзину». Если эти элементы расположены хаотично в иерархии view, accessibilityElements выстраивает правильный порядок для VoiceOver.
let productCard = UIView()
let productImage = UIImageView()
let productName = UILabel()
let productPrice = UILabel()
let addToCartButton = UIButton()
productCard.accessibilityElements = [
productImage, productName, productPrice, addToCartButton
]
Для объединения нескольких элементов в один доступный элемент используется UIAccessibilityContainer или accessibilityFrame для переопределения области касания. Это полезно, когда ячейка таблицы содержит несколько UI-компонентов, но логически представляет один элемент — VoiceOver должен озвучить всю ячейку целиком, а не перебирать её содержимое по отдельности.
Корректная настройка доступности для VoiceOver требует внимания к нескольким аспектам: семантическая разметка, динамические обновления, обработка пользовательских элементов и тестирование с реальным screen reader'ом.
В SwiftUI доступность настраивается через модификаторы .accessibilityLabel(), .accessibilityValue(), .accessibilityHint() и .accessibilityAddTraits(). SwiftUI автоматически наследует доступность из стандартных элементов, но для кастомных компонентов требуется явная настройка. Например, кастомный ползунок должен сообщать VoiceOver своё значение и формат изменения.
Slider(value: $volume, in: 0...100)
.accessibilityLabel("Громкость звука")
.accessibilityValue(
Text("\(Int(volume)) процентов")
)
.accessibilityAddTraits(.adjustsAudioForAccessibility)
.accessibilityAdjustableAction { direction in
switch direction {
case .increment: volume = min(volume + 5, 100)
case .decrement: volume = max(volume - 5, 0)
}
}
Модификатор accessibilityAdjustableAction добавляет возможность изменения значения жестами VoiceOver: свайп вверх — увеличить, свайп вниз — уменьшить. Без этого модификатора ползунок останется недоступным для управления через screen reader. Аналогичная настройка требуется для кастомных stepper'ов, picker'ов и других элементов, изменяющих своё значение.
Когда контент на экране изменяется динамически (появилось уведомление, обновился статус загрузки, изменилась цена), VoiceOver должен получить уведомление через UIAccessibility.post. Без этого вызова screen reader не узнает об изменениях и пользователь пропустит важную информацию. Для SwiftUI используется модификатор .accessibilityAnnouncement().
UIAccessibility.post(
notification: .announcement,
argument: "Цена снижена на 20 процентов"
)
// SwiftUI
Text("Цена обновлена")
.accessibilityAnnouncement(Text("Скидка 20%"))
Уведомления VoiceOver следует использовать осмысленно: избыточные объявления раздражают пользователя, а их отсутствие делает приложение недоступным. Оптимальная стратегия — объявлять только те изменения, которые влияют на текущий рабочий процесс пользователя: обновление корзины, статус загрузки, ошибка валидации формы, уведомление чата. Фоновые изменения (время на панели, курс валют) не требуют объявления — пользователь сам проверит их при необходимости.
Тестирование VoiceOver выполняется через физическое устройство с включённым screen reader'ом или симулятор iOS с опцией Accessibility Inspector. Важно проверить сценарии полного использования: без зрительного контроля пройти регистрацию, оформить заказ, найти товар по поиску. Если маршрут проходим без визуальной обратной связи — VoiceOver настроен корректно.
Часто задаваемые вопросы
Настройки → Универсальный доступ → VoiceOver. Включите переключатель. Для быстрого включения используется тройное нажатие боковой кнопки (на iPhone X и новее) или кнопки Домой. Siri также может включить VoiceOver по команде «Включи VoiceOver».
VoiceOver — экранный диктор Apple для iOS, TalkBack — экранный диктор Google для Android. Принцип работы одинаков: касание озвучивает, двойное касание активирует. Разница в жестах, настройках ротора и экосистемных интеграциях: VoiceOver глубже интегрирован с iCloud и Apple Pay.
Используйте API UIAccessibility: задайте accessibilityLabel для всех элементов, accessibilityTraits для типа элемента и accessibilityHint для подсказок. В SwiftUI применяйте модификаторы .accessibilityLabel() и .accessibilityAddTraits(). Тестируйте приложение с включённым VoiceOver.
Ротор — режим навигации, переключаемый вращением двух пальцев. Он определяет, как перемещаться между элементами: по заголовкам, символам, словам, ссылкам или точкам входа. Разработчики могут добавить свои режимы через UIAccessibilityCustomRotor.
Для кастомных UIView необходимо установить isAccessibilityElement = true и задать accessibilityLabel. Если элемент состоит из нескольких дочерних view, используйте accessibilityElements для задания порядка чтения или объедините их в контейнер.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также