VoiceOver: что это, жесты управления и возможности на iOS

Автор: IT Sectr Опубликовано: 2026-05-15 Время чтения: 8 мин

VoiceOver — встроенный экранный диктор (screen reader) от Apple, который озвучивает каждый элемент интерфейса и позволяет управлять устройством с помощью жестов. Технология встроена в iOS, iPadOS и macOS на системном уровне и не требует установки дополнительного ПО. По данным Apple Accessibility (2025), VoiceOver поддерживает более 40 языков и используется миллионами незрячих и слабовидящих пользователей по всему миру.

Главное

  • VoiceOver — встроенный screen reader на iOS, iPadOS и macOS, управляемый жестами и голосом
  • Ротор VoiceOver переключает режимы навигации: слова, символы, заголовки, ссылки
  • Жесты включают касание (озвучивание), свайп (переход) и двойное касание (активация)
  • Разработчики настраивают доступность через UIAccessibility и Accessibility Label
  • VoiceOver интегрируется с динамическим текстом и брайлевскими дисплеями

Что такое VoiceOver?

VoiceOver — это экранный диктор (screen reader), встроенный в операционные системы Apple. Он предназначен для незрячих и слабовидящих пользователей и обеспечивает полноценное взаимодействие с устройством без визуального контакта. VoiceOver озвучивает все элементы интерфейса: кнопки, ссылки, текст, изображения, уведомления и системные элементы.

Технология была впервые представлена в 2005 году для macOS, а на iOS появилась вместе с iPhone 3GS в 2009 году. С тех пор VoiceOver стал неотъемлемой частью экосистемы Apple и одним из главных аргументов в пользу доступности платформы. VoiceOver встроен на системном уровне — это значит, что он работает в любом приложении без дополнительной интеграции со стороны разработчика, хотя качество озвучивания напрямую зависит от того, насколько хорошо приложение использует API доступности iOS.

VoiceOver поддерживает более 40 языков с естественным синтезом речи и адаптируется под региональные настройки голоса. На iOS VoiceOver использует голосовые движки Siri для русского и ряда других языков, что обеспечивает максимально естественное звучание и правильную интонацию в зависимости от пунктуации и контекста.

Как работает VoiceOver?

VoiceOver перехватывает события касания и интерпретирует их иначе, чем стандартный ввод iOS. Когда пользователь касается экрана, VoiceOver не активирует элемент под пальцем, а сначала озвучивает его. Только после двойного касания элемент активируется. Это ключевое отличие, которое позволяет незрячим пользователям исследовать интерфейс без риска случайного нажатия.

Порядок чтения и навигация

VoiceOver читает элементы интерфейса в логическом порядке: слева направо, сверху вниз. Порядок чтения наследуется из иерархии представлений iOS, но разработчик может изменить его через свойство accessibilityElements для сложных макетов. Пользователь может перемещаться между элементами свайпом вправо (следующий) и влево (предыдущий), а также касаться конкретного элемента для его озвучивания.

При каждом перемещении VoiceOver произносит тип элемента (кнопка, ссылка, заголовок), его название (accessibilityLabel), состояние (выбрано, отключено) и подсказку (accessibilityHint). Если элемент содержит значение — например, ползунок громкости — VoiceOver озвучивает и его. Accessibility Traits (UIAccessibilityTraits) дополнительно сообщают пользователю о поведении элемента: является ли он кнопкой, переключателем, поиском или клавишей клавиатуры.

Ротор VoiceOver

Ротор — это виртуальная ручка настройки, которая переключает режим навигации VoiceOver. Пользователь вращает ротор двумя пальцами (как ручку громкости) и выбирает режим: слова, символы, заголовки, ссылки, точки входа, строки таблицы и другие. Режим заголовков позволяет быстро переключаться между H1-H6 на веб-страницах и в приложениях, а режим символов — произносить текст по буквам, что полезно при заполнении форм или вводе кодов подтверждения.

Разработчик может добавлять собственные режимы в ротор через API UIAccessibilityCustomRotor. Например, в приложении для заметок можно добавить ротор «Избранные заметки» или «Последние изменения». Кастомные роторы значительно ускоряют навигацию в специфических приложениях и считаются лучшей практикой accessibility на iOS.

Жесты управления VoiceOver

VoiceOver использует собственный набор жестов, которые не совпадают со стандартными жестами iOS. Большинство жестов выполняется тремя пальцами вместо одного — это предотвращает конфликты с обычным управлением и позволяет VoiceOver работать одновременно со стандартным вводом.

ДействиеЖестРезультат
Озвучить элементКасание 1 пальцемПроизносит название элемента
АктивироватьДвойное касаниеНажатие кнопки или ссылки
Следующий элементСвайп вправоПереход к следующему
Предыдущий элементСвайп влевоВозврат к предыдущему
Прокрутка3 пальца свайпПрокрутка списка или страницы
Ротор2 пальца вращениеСмена режима навигации

Жест двойное касание является основным способом активации элементов в VoiceOver. Если элемент требует специального действия (например, перетаскивание), VoiceOver использует последовательность «касание — двойное касание и удержание» для входа в режим перемещения. Это позволяет выполнять сложные жесты, такие как drag-and-drop, не видя экран. VoiceOver также поддерживает жест «двойное касание двумя пальцами» для отмены действия и «тройное касание» для включения/выключения экранной шторки (Screen Curtain).

VoiceOver в мобильной разработке

Разработчик iOS-приложения может значительно улучшить взаимодействие с VoiceOver через API UIAccessibility. Базовые настройки доступности добавляются в Interface Builder (Identity Inspector → Accessibility), но для сложных интерфейсов требуется программная настройка в коде.

Accessibility Label и Traits

Свойство accessibilityLabel задаёт текст, который VoiceOver произносит для элемента. Если label не задан, VoiceOver использует текст кнопки или placeholder текстового поля. Для элементов без текста (иконок, кастомных view) label обязателен. Свойство accessibilityTraits определяет тип элемента: кнопка, заголовок, переключатель, поиск, клавиша клавиатуры, значение изменяется, ссылка и другие.

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

swift
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

Корректная настройка доступности для VoiceOver требует внимания к нескольким аспектам: семантическая разметка, динамические обновления, обработка пользовательских элементов и тестирование с реальным screen reader'ом.

Семантическая разметка в SwiftUI

В SwiftUI доступность настраивается через модификаторы .accessibilityLabel(), .accessibilityValue(), .accessibilityHint() и .accessibilityAddTraits(). SwiftUI автоматически наследует доступность из стандартных элементов, но для кастомных компонентов требуется явная настройка. Например, кастомный ползунок должен сообщать VoiceOver своё значение и формат изменения.

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

swift
UIAccessibility.post(
    notification: .announcement,
    argument: "Цена снижена на 20 процентов"
)

// SwiftUI
Text("Цена обновлена")
    .accessibilityAnnouncement(Text("Скидка 20%"))

Уведомления VoiceOver следует использовать осмысленно: избыточные объявления раздражают пользователя, а их отсутствие делает приложение недоступным. Оптимальная стратегия — объявлять только те изменения, которые влияют на текущий рабочий процесс пользователя: обновление корзины, статус загрузки, ошибка валидации формы, уведомление чата. Фоновые изменения (время на панели, курс валют) не требуют объявления — пользователь сам проверит их при необходимости.

Тестирование VoiceOver выполняется через физическое устройство с включённым screen reader'ом или симулятор iOS с опцией Accessibility Inspector. Важно проверить сценарии полного использования: без зрительного контроля пройти регистрацию, оформить заказ, найти товар по поиску. Если маршрут проходим без визуальной обратной связи — VoiceOver настроен корректно.

Часто задаваемые вопросы

Как включить VoiceOver на iPhone?

Настройки → Универсальный доступ → VoiceOver. Включите переключатель. Для быстрого включения используется тройное нажатие боковой кнопки (на iPhone X и новее) или кнопки Домой. Siri также может включить VoiceOver по команде «Включи VoiceOver».

Чем VoiceOver отличается от TalkBack?

VoiceOver — экранный диктор Apple для iOS, TalkBack — экранный диктор Google для Android. Принцип работы одинаков: касание озвучивает, двойное касание активирует. Разница в жестах, настройках ротора и экосистемных интеграциях: VoiceOver глубже интегрирован с iCloud и Apple Pay.

Как настроить VoiceOver для своего приложения?

Используйте API UIAccessibility: задайте accessibilityLabel для всех элементов, accessibilityTraits для типа элемента и accessibilityHint для подсказок. В SwiftUI применяйте модификаторы .accessibilityLabel() и .accessibilityAddTraits(). Тестируйте приложение с включённым VoiceOver.

Что такое ротор в VoiceOver?

Ротор — режим навигации, переключаемый вращением двух пальцев. Он определяет, как перемещаться между элементами: по заголовкам, символам, словам, ссылкам или точкам входа. Разработчики могут добавить свои режимы через UIAccessibilityCustomRotor.

Почему VoiceOver не читает мой кастомный элемент?

Для кастомных UIView необходимо установить isAccessibilityElement = true и задать accessibilityLabel. Если элемент состоит из нескольких дочерних view, используйте accessibilityElements для задания порядка чтения или объедините их в контейнер.

Итоги

  • VoiceOver — встроенный screen reader Apple для iOS, iPadOS и macOS с голосовым управлением жестами
  • Ротор переключает режимы навигации: заголовки, символы, слова, ссылки и кастомные режимы
  • Жесты VoiceOver: касание — озвучивание, двойное касание — активация, свайп — навигация
  • Разработка через API UIAccessibility: label, traits, hint, custom rotor и динамические уведомления
  • SwiftUI предоставляет модификаторы .accessibilityLabel(), .accessibilityAddTraits() и .accessibilityAdjustableAction()
  • Динамические обновления требуют вызова UIAccessibility.post для уведомления VoiceOver
  • Тестирование обязательно на реальном устройстве с включённым VoiceOver без визуального контроля

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также