2016-05-31 4 views
3

Я пытаюсь добавить поддержку доступности IOS/Voice Over в свое приложение. Мой главный экран имеет три основных элемента управления, но третий элемент управления размещен внутри встроенного контроллера представления.настройка view.accessibilityElements со встроенными контроллерами просмотров

Я устанавливаю элементы доступности в prepareForSegue и подтвердил, что все встроенные контроллеры управления просмотром загружены. Проблема в том, что я все еще могу выбрать только первые два элемента управления, которые находятся в закрытом виде.

self.view.accessibilityElements = 
    @[ 
     self.cmdMenu,      // works 
     self.collectionView,    // works 
     self.childViewController.peerMenu // doesn't work 
    ]; 

Все три вида имеютAccessibilityElement = YES.

Я что-то упустил? Я не могу себе представить, что существует ограничение на элементы доступности, находящиеся в одном контроллере представления.

+0

какие виды? есть ли другие отличия? если вы удаляете представление коллекции из массива, есть ли другой результат? – Wain

+0

Оба представления меню являются экземплярами элемента управления, который я создал.Если я удалю collectionView из AccessibilityElements, то доступен только cmdMenu. –

ответ

3

Я нашел свою ошибку, и теперь у меня есть работа над голосом. В ходе этого процесса я выяснил ряд вещей, которые хотел бы поделиться.

  1. К моему первоначальному вопросу вы можете ссылаться на элементы управления на контроллерах вашего дочернего вида с вашего основного контроллера. Вы можете добавить элементы управления напрямую (как в моем вопросе), либо добавить элементы доступности в контроллере дочернего представления, используя self.view.accessibilityElements = @[ _control1, childViewController.view, childViewController2.view].
  2. Если вы добавите все элементы управления в контроллер дочернего представления, как в (1.), тогда убедитесь, что childViewController.view.isAccessibilityElement = NO.
  3. Вы можете добавить любой объект к accessibilityElements, даже элементы, которые не имеют информации о доступности. API не будет утверждать или предупреждать вас. Это оказалось моей ошибкой.
  4. Если ваш пользовательский интерфейс изменяется, и вам нужно изменить количество или порядок элементов в вашем массиве accessibilityElements, сообщите об этом UIKit, используя UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, self). Аргумент уведомления (где я отправляю self) сообщает Voice Over, где он должен позиционировать свой курсор, когда уведомление завершено.
  5. Если вы хотите прочитать вслух какой-то текст для временного уведомления (представьте, когда Clash Of Clans расскажет вам, сколько драгоценных камней вы нашли в этом пеньке) звоните UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, messageText). Одно предостережение, это не будет читать вслух messageText, если не будет никакого другого Voice Over. Вам нужно самому управлять временем. Представлено сообщение об ошибке. Apple может сделать это намного лучше.
  6. Если вы используете UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, messageText), вы можете послушать UIAccessibilityAnnouncementDidFinishNotification, но, к сожалению, это уведомление почти не имеет значения. Вы получите уведомление только в том случае, если ваше сообщениеText было полностью произнесено. Он не говорит вам, что это было произнесено, но прервано, и оно также не будет вызвано для любого текста, переданного через структуру UIKit.
  7. Инспектор доступности в симуляторе iOS отстой. Если ваши настройки доступности верны, он может рассказать вам, что там есть. Если у вас есть проблема, инспектор не предоставляет вам никакой информации о том, что не так. Это относится ко всему API UIAccessibility. Он настолько прост в использовании, что почти всегда работает. Но когда это не сработает, вам нужно прибегнуть к охоте и клюнуть, чтобы понять это. API нуждается в некоторых утверждениях или консольных сообщениях, похожих на то, как Apple обрабатывает предупреждения Constraint. Предупреждение о спойлере: инспектор доступности в Xcode 8 работает лучше, но все равно не помог бы с моей проблемой.
  8. В заголовке UIAccessibility.h есть тонна хорошей информации. Если вы приступаете к поддержке UIAccessibility, это хорошо читается.
+0

Отличная запись! Это вызывало множество проблем в наших XCUITests, особенно не используя 'UIAccessibilityPostNotification (UIAccessibilityLayoutChangedNotification, self)', так как иерархия доступности быстро устаревает. –