настройка view.accessibilityElements со встроенными контроллерами представления

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

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

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

Все три представления имеют isAccessibilityElement = YES.

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


person Dan Loughney    schedule 31.05.2016    source источник
comment
какие взгляды? есть ли другие отличия? если вы удалите представление коллекции из массива, будет ли другой результат?   -  person Wain    schedule 31.05.2016
comment
Оба представления меню являются экземплярами элемента управления, который я создал. Если я удалю collectionView из accessibilityElements, то будет доступен только cmdMenu.   -  person Dan Loughney    schedule 31.05.2016


Ответы (1)


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

  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). Одно предостережение: текст сообщения не будет прочитан вслух, если только нет другого голоса за кадром. Вы должны сами управлять временем. Отправили ошибку по этому поводу. Apple могла бы сделать это намного лучше.
  6. Если вы используете UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, messageText), вы можете прослушивать UIAccessibilityAnnouncementDidFinishNotification, но, к сожалению, это уведомление почти не имеет значения. Вы получите уведомление только в том случае, если ваш текст сообщения был полностью произнесен. Он не говорит вам, что он был произнесен, но прерван, и он также не будет срабатывать для любого текста, произнесенного через инфраструктуру UIKit.
  7. Инспектор специальных возможностей в симуляторе iOS — отстой. Если ваши настройки доступности верны, он может сказать вам, что там. Если у вас есть проблема, Инспектор не предоставляет вам никакой информации о том, что не так. Это верно для всего API UIAccessibility. Он настолько прост в использовании, что почти всегда работает. Но когда это не работает, вам нужно прибегнуть к охоте и клевать, чтобы понять это. API нужны некоторые утверждения или консольные сообщения, подобные тому, как Apple обрабатывает предупреждения Constraint. Спойлер: инспектор специальных возможностей в Xcode 8 намного лучше, но все равно не помог бы с моей проблемой.
  8. В заголовке UIAccessibility.h есть масса полезной информации. Если вы приступаете к поддержке UIAccessibility, это полезно прочитать.
person Dan Loughney    schedule 06.06.2016
comment
Отличная рецензия! Это вызывало множество проблем в наших XCUITests, особенно без использования UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, self), поскольку иерархия доступности быстро устаревает. - person Chase Holland; 13.10.2016