Запретить VoiceOver автоматически фокусироваться на объекте

На главном экране, когда вы проводите тремя пальцами для навигации по страницам домашних экранов, обратите внимание, как сфокусированное приложение теряет фокус при смахивании, страница меняется, VoiceOver объявляет новый номер страницы, а затем принудительно фокусирует первое приложение на этой странице. . Есть период времени, когда ничего не сфокусировано. У меня есть аналогичный интерфейс в моем приложении, и мне нужно сделать то же самое.

Прямо сейчас я публикую объявление, чтобы указать номер страницы, а затем программно меняю страницу, но это объявление не успевает завершиться до тех пор, пока VoiceOver автоматически не сфокусирует элемент на новой странице, а затем объявит эту метку. Мое объявление прерывается.

Как запретить VoiceOver автоматически фокусировать элемент при переключении страниц в UIPageViewController или иным образом добиться желаемого поведения?

РЕДАКТИРОВАТЬ: я вижу, что вы должны публиковать UIAccessibilityPageScrolledNotification при изменении страницы, и вы можете предоставить строку в качестве аргумента, который VoiceOver объявит, чтобы указать новую позицию страницы. Тем не менее, нет никакого способа узнать, когда это уведомление заканчивается, я не верю, поэтому я не могу принудительно сфокусироваться после того, как оно закончило говорить.


person Jordan H    schedule 01.01.2015    source источник


Ответы (1)


Если вы хотите предоставить собственное уведомление о статусе прокрутки, реализуйте -accessibilityScrollStatusForScrollView:, чтобы предоставить клиентам специальных возможностей строку состояния прокрутки. Если -accessibilityScroll: переопределено, вместо этого опубликуйте UIAccessibilityPageScrolledNotification.

Если вы хотите упорядочивать объявления, зарегистрируйтесь на сайте UIAccessibilityAnnouncementDidFinishNotification и опубликуйте уведомление об изменении экрана из обработчика уведомлений. Также обратите внимание на наличие ключа UIAccessibilityAnnouncementKeyWasSuccessful в словаре уведомлений.

Как мы обсуждали в комментариях, у вас возникли проблемы с навигацией UIPageViewController, прерывающей ваше объявление, даже после экспериментов с описанными выше методами. Важно опубликовать UIAccessibilityPageScrolledNotification после завершения перехода. Метод UIPageViewController, который вы используете для обмена страницами, setViewControllers:direction:animated:completion:, принимает блок завершения. Размещая уведомление о прокрутке страницы в блоке завершения, а не на следующей строке, вы можете избежать прерывания.

person Justin    schedule 02.01.2015
comment
Я установил для делегата scrollView контроллера просмотра страниц значение self, но accessibilityScrollStatusForScrollView не вызывается. Self соответствует UIScrollViewAccessibilityDelegate. Я что-то упускаю? - person Jordan H; 05.01.2015
comment
UIAccessibilityPageScrolledNotification — более старая техника. Объявляет ли ваш класс себя соответствующим UIScrollViewAccessibilityDelegate в своем интерфейсе? Этот протокол происходит от UIScrollViewDelegate. - person Justin; 05.01.2015
comment
Да, он подтверждает UIScrollViewAccessibilityDelegate в своем интерфейсе. - person Jordan H; 05.01.2015