Я обнаружил ошибку, из-за которой Voice Over не объявлял элементы так, как мы хотели. У меня было перекрывающееся представление, которое можно было представить динамически, и при представлении мы хотели, чтобы элементы родственных представлений не объявлялись.

Вот как выглядела иерархия:

ComponentContainerView subviews [
    ViewA,
    RefreshView // This view is added and removed. 
]

RefreshView - это динамическое представление, которое полностью перекрывает ViewA при представлении. Вот пример того, как представление может быть модально добавлено и удалено:

По умолчанию Voice Over будет проходить по иерархии и объявлять элементы представления. Сначала он проходит через элементы в ViewA , а затем через элементы в RefreshView ..

Поскольку RefreshView может модально перекрывать ViewA, мы хотим обеспечить элементы доступности в базовом ViewA не объявляются, когда перекрывающийся RefreshView представлен модально. Voice Over не знает, когда одноуровневые представления перекрываются, поэтому нам нужно настроить Voice Over, чтобы он знал, какое представление является модальным, чтобы оно могло игнорировать элементы в одноуровневых представлениях.

accessibilityViewIsModal спешит на помощь

Apple представила свойство accessibilityViewIsModal в iOS 5 и недавно в Mac Catalyst 13.0. Значение по умолчанию - false, но если задано значение true, Voice Over будет игнорировать родственные представления с одним и тем же родителем. Итак, в нашем случае установка для accessibilityViewIsModal значения true в RefreshView заставляет Voice Over игнорировать элементы в ViewA, потому что они имеют одного и того же родителя.

Помимо установки этого свойства на true, вам также необходимо отправить уведомление .screenChanged в UIAccessibility, конечно, чтобы Voice Over узнал, что accessibilityElements на экране изменились.

Это все, что вам нужно сделать, чтобы закадровый голос игнорировал ViewA без необходимости иметь код отслеживания для управления вашими элементами доступности. Это то, что мы в итоге сделали, и это избавило от обнаруженных ошибок.

Я рад, что ошибка была устранена, и надеюсь, что вы узнали что-то новое.

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

Не стесняйтесь поделиться этой записью, и если вам понравилось ее читать, я буду признателен, если вы дадите мне знать. Вы также можете проверить мои Пакеты с открытым исходным кодом Github.

Спасибо