Я хотел бы спросить, как разработать голосовую помощь по запросу с включенной функцией VoiceOver.
У меня есть такой код для создания UIButton:
_myLocationButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[_myLocationButton setImage:[UIImage imageNamed:@"my_location_icon"] forState:UIControlStateNormal];
_myLocationButton.accessibilityLabel = @"My location";
_myLocationButton.accessibilityHint = @"Double tap to hear where You are, in which zone or near zone and floor information in building";
[_myLocationButton addTarget:self
action:@selector(myLocationButtonPressed)
forControlEvents:UIControlEventTouchUpInside];
Теперь в методе myLocationButtonPressed у меня есть такой код:
UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, positionDescription);
Мой вопрос. Когда я пытаюсь дважды нажать, когда myLocationButton активен, VoiceOver говорит только: "Мое местоположение". Я бы хотел, чтобы после двойного нажатия я хотел услышать positionDescription, а не кнопку accessibilityLabel. Я знаю, что метод myLocationButtonPressed вызывается, но по неизвестной причине публикация события UIAccessibilityAnnouncementNotification ничего не делает, и я ничего не слышу.
Может кто-нибудь дать мне несколько советов, как подойти к такой проблеме.
Ответ 1 · рейтинг 1 · ChrisCM
Единственный способ, который я обнаружил, чтобы объявления читались последовательно, - это опубликовать уведомление с задержкой. Эта функция должна помочь.
- (void)postVoiceOverAnnouncement:(NSString*)message withDelay:(int)seconds {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(seconds * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, @"This will get read out");
});
}
Даже с добавлением признака запуска медиа-сессии что-то все еще прерывает объявление. На что вы должны обратить внимание, так это на продолжительность вашей задержки. Если кто-то продолжит просматривать ваше приложение, он может прервать объявление. Хотя, поскольку в правильно доступном приложении эта информация должна быть доступна в другом месте, они должны иметь возможность найти ее снова. Это, конечно, просто полезное объявление, чтобы не смещать фокус на ничего не подозревающих пользователей VoiceOver :).
Еще одна проблема с вашим кодом, которую я заметил:
_myLocationButton.accessibilityHint = @"Double tap to hear where You are, in which zone or near zone and floor information in building";
Во-первых, браво за такие подробные подсказки! Однако вы не должны включать часть "Двойное касание, чтобы...". Пользователи умеют взаимодействовать с кнопками через VoiceOver. Это единственный способ взаимодействия с этим? Или можно также нажать Enter на внешней клавиатуре? Как насчет некоторых других гипотетических АТ, в которых жест выбора является каким-то другим взаимодействием... Насколько полезна эта подсказка для тех, кто использует доску Брайля??? Просто сообщите пользователям о последствиях взаимодействия с объектом, пусть АТ позаботится обо всем остальном.