Поиск…
Вступление
Доступность iOS позволяет пользователям с нарушениями слуха и визуальными нарушениями обращаться к iOS и вашему приложению, поддерживая различные функции, такие как VoiceOver, Voice Control, White on Black, Mono Audio, Speech to Text и т. Д. Обеспечение доступности в приложении iOS означает, что приложение можно использовать для всех.
Сделать доступным доступ
Отметьте свой подкласс UIView
как доступный элемент, чтобы он отображался в VoiceOver.
myView.isAccessibilityElement = YES;
Убедитесь, что представление говорит о значимой метке, значении и подсказке. Apple предоставляет более подробную информацию о том, как выбирать хорошие описания в Руководстве по программированию специальных возможностей .
Рамка доступности
Кадр доступности используется VoiceOver для отслеживания ударов, рисования курсора VoiceOver и расчета того, где в сфокусированном элементе имитируется крана, когда пользователь дважды нажимает на экран. Обратите внимание, что кадр находится в координатах экрана!
myElement.accessibilityFrame = frameInScreenCoordinates;
Если ваши элементы или макеты экрана часто меняются, рассмотрите возможность переопределения - accessibilityFrame
чтобы всегда предоставлять обновленный прямоугольник. Вычисление относительного кадра, относящегося к просмотру прокрутки, может быть подверженным ошибкам и утомительным. iOS 10 вводит новый API, чтобы сделать это проще: accessibilityFrameInContainerSpace
.
Изменение экрана
VoiceOver отлично работает большую часть времени, легко читая вслух экраны, наполненные контентом и интуитивно следуя за пользователем. Увы, общее решение не является совершенным. Иногда только вы, разработчик приложения, знаете, где VoiceOver должен быть сфокусирован на оптимальном опыте пользователя. К счастью, VoiceOver прислушивается к уведомлениям о доступности системы, чтобы узнать, где находится фокус. Чтобы переместить курсор VoiceOver вручную, опубликуйте экран с измененной информацией:
UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, firstElement);
Когда это уведомление опубликовано, короткая серия тонов уведомляет пользователей об этом изменении. Второй параметр может быть либо следующим элементом для фокусировки, либо строкой, объявляющей об изменении. Публикуйте уведомление об изменении экрана только в том случае, если у него плохой опыт VoiceOver, и нет другого способа обхода проблемы. Перемещение курсора VoiceOver похоже на то, чтобы заглянуть на экран с видимым пользователем. Это может быть раздражающим и дезориентирующим, чтобы вестись таким образом.
Изменение макета
Во многих случаях содержимое на одном экране будет обновляться новым или другим контентом. Например, представьте форму, которая показывает дополнительные параметры, основанные на ответе пользователя на предыдущий вопрос. В этом случае уведомление «изменение макета» позволяет либо объявить об изменении, либо сосредоточиться на новом элементе. Это уведомление принимает те же параметры, что и уведомление об изменении экрана.
UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, firstElement);
Объявление
Объявления полезны для оповещения пользователей о событиях, которые не требуют какого-либо взаимодействия, например, «заблокирован экран» или «завершена загрузка». Используйте более конкретное объявление, чтобы уведомлять пользователей об изменениях экрана или более мелких изменениях макета.
UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, @"The thing happened!");
Элементы заказа
VoiceOver перемещается с верхнего левого угла в нижнее правое, независимо от иерархии представлений. Как правило, контент размещается на языках слева направо, так как зрячие люди склонны сканировать экран в «F-образном шаблоне». Пользователи VoiceOver будут ориентироваться так же, как и обычные пользователи. Предсказуемость и согласованность очень важны для доступности. Пожалуйста, воздержитесь от настроек, которые «улучшают» поведение по умолчанию (например, сначала заказывайте панель вкладок в порядке выбора). Тем не менее, если вы получили отзывы о том, что порядок элементов в вашем приложении удивителен, есть несколько способов, которыми вы можете улучшить опыт.
Если VoiceOver должен читать подпункты представления один за другим, но это не так, вам может потребоваться указать VoiceOver, что элементы, содержащиеся в одном представлении, связаны. Вы можете сделать это, установив shouldGroupAccessibiltyChildren
:
myView.shouldGroupAccessibilityChildren = YES;
Для поддержки сложных навигационных структур, которые охватывают несколько контейнеров или включают в себя интерфейсы, визуализированные без UIKit, рассмотрите возможность внедрения контейнерного протокола в родительском представлении.
Контейнер доступности
VoiceOver может перемещаться много приложений на прошивку , так как большинство UIKit
классов реализуют UIAccessibilityProtocol
. Функции, которые не представляют собой экранные элементы с использованием UIView
, включая приложения, которые используют Core Graphics или Metal для выполнения чертежа, должны описывать эти элементы для доступности. Начиная с iOS 8.0, это можно сделать, назначив свойство UIView
содержащее недоступные элементы:
myInaccessibleContainerView.accessibilityElements = @[elements, that, should, be, accessible];
Каждый объект в массиве может быть экземпляром UIAccessibilityElement
или любым другим классом, который придерживается UIAccessibilityProtocol
. Детские элементы должны быть возвращены в том порядке, в котором пользователь должен их перемещать. В качестве автора приложения вы можете использовать контейнеры доступности, чтобы переопределить порядок навигации по левому краю по умолчанию в нижнем правом углу навигации VoiceOver. Учитывая, что UIView
реализует UIAccessibilityProtocol
, вы можете комбинировать экземпляры UIAccessibilityElement
и UIView
в том же массиве элементов детской доступности. Обратите внимание: если вы назначаете элементы вручную, вам не нужно применять какие-либо методы протокола динамической доступности, хотя вам может потребоваться выдать уведомление об изменении экрана для элементов, которые будут обнаружены VoiceOver.
Модальный вид
Модальные представления полностью захватывают внимание пользователя до завершения задачи. iOS разъясняет это пользователям, затемняя и отключая все остальные контенты, когда видится модальное представление, такое как предупреждение или popover. Приложение, которое реализует пользовательский модальный интерфейс, должно указывать на VoiceOver, что этот взгляд заслуживает отдельного внимания пользователя, установив accessibilityViewIsModal
. Обратите внимание, что это свойство должно быть установлено только в представлении, содержащем модальный контент, а не в элементах, содержащихся в модальном представлении.
myModalView.accessibilityViewIsModal = YES;
Пометка вида как модального поощряет VoiceOver игнорировать взгляды братьев и сестер. Если после установки этого свойства вы обнаружите, что VoiceOver по-прежнему перемещает другие элементы в вашем приложении, попробуйте скрывать представления проблем до тех пор, пока модальный не отклонит.
Скрытие элементов
Большинство классов UIKit, включая UIView, придерживаются UIAccessibilityProtocol
и возвращают правильные значения по умолчанию. Легко считать само собой разумеющимся, что UIView
установленный для UIView
также отсутствует в иерархии доступности и не будет перемещаться с помощью VoiceOver. Хотя этого поведения по умолчанию, как правило, достаточно, бывают случаи, когда представление будет присутствовать в иерархии представлений, но не видимо или судоходно. Например, набор кнопок может перекрываться другим видом, делая их невидимыми для наблюдаемого пользователя. Тем не менее VoiceOver по-прежнему будет пытаться перемещаться по ним, поскольку они технически не скрыты от UIKit
и поэтому все еще присутствуют в иерархии доступности. В таких случаях вы должны намекнуть на VoiceOver, что родительское представление недоступно. Вы можете сделать это, явно скрывая представление от UIKit, установив скрытый, когда представление заходит на экран:
myViewFullofButtons.hidden = YES;
Кроме того, вы можете оставить родительский вид видимым и просто скрыть его дочерние элементы из иерархии доступности:
myViewFullofButtons.accessibilityElementsHidden = YES;
Временные представления - это другое место, которое вы хотите скрыть элементы из иерархии доступности, оставив их видимыми для пользователей. Например, вид, который появляется, когда вы нажимаете кнопку громкости, видится видимым пользователям, но не требует внимания, как это делает обычное предупреждение. Вы не хотите, чтобы VoiceOver прерывал пользователя и перемещал курсор от того, что они делали, чтобы объявить новый том, особенно учитывая, что регулировка громкости уже обеспечивает аудиальную обратную связь через звук щелчка. В подобных случаях вам нужно скрыть представление, используя accessibilityElementsHidden
.