VoiceOver читает ярлыки на предыдущем просмотре в приложении iPhone? ошибка? - PullRequest
6 голосов
/ 27 марта 2012

Я создаю приложение, основанное на представлении, в котором я собираюсь перейти к следующему представлению, используя метод addSubview. Проблема в том, что, когда я включаю функцию VoiceOver и добавляю просмотры, она берет метки аксессуаров из предыдущих представлений. То есть, если я нажму на представление в прямоугольнике, где есть метка в предыдущем представлении, то VoiceOver также обнаружит ее как метку доступности и начнет читать эту метку. Но, если я использую контроллер навигации для перехода к следующему контроллеру просмотра, у меня не возникает никаких проблем. Может кто-нибудь сказать мне, если Apple сама поддерживает функцию VoiceOver только для приложений на основе навигации, или есть какое-то другое решение для VoiceOver в приложениях на основе просмотра?

PS Я пробовал то же самое на некоторых демонстрационных приложениях, но результаты те же.

Итак, когда в текущем представлении я добавляю подпредставление, которое содержит кнопки, специальные возможности также читают метки за подпредставлением. Я хочу, чтобы специальные возможности читали кнопки в добавленном представлении и оставшуюся часть видимой части предыдущего представления (а не ярлыки, скрытые за добавленным представлением). может кто-нибудь сказать, если это ошибка наложения голоса в iPhone, что по умолчанию он также читает метки parentView, на addubview?

Ответы [ 4 ]

7 голосов
/ 27 марта 2012

Если представление находится в иерархии представлений, даже если оно скрыто другим представлением поверх него, VoiceOver обнаружит это.

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

Чтобы управлять переходами между экранами в вашем приложении, вы должны использоватьКонтейнерный контроллер, такой как контроллер навигации (или ваш собственный).Вы можете отключить панель навигации и эффекты перехода, если хотите, и просто использовать ее для управления вашим стеком представлений.Когда вы помещаете новый контроллер представления в стек, предыдущий будет удален, и ваша проблема исчезнет.

Поэтому вам следует серьезно пересмотреть способ управления вашими экранами и представлениями.UIViewController Внутри какого-то контейнера есть путь.По крайней мере, вы должны удалить старый вид при добавлении нового на экран.

4 голосов
/ 02 марта 2016

Можно установить для свойства accessibilityViewIsModal представления значение YES.

@ property (nonatomic) BOOL accessibilityViewIsModal NS_AVAILABLE_IOS (5_0);

Сообщает, следует ли рассматривать принимающее представлениемодальный по доступности.Если ДА, то элементы вне этого представления будут игнорироваться.Только элементы внутри этого представления будут выставлены.по умолчанию == НЕТ

, поэтому независимо от того, какое представление вы добавляете, установите для accessibilityViewIsModal значение YES / true.

view.accessibilityViewIsModal = YES

3 голосов
/ 26 мая 2015

У меня была такая же проблема, как и у вас, и я потратил некоторое время на ее решение.Когда вы добавляете представление B к представлению A, вы не скрываете представление A. Представление продолжается там, и, как ожидается от voiceOver, оно будет читать это представление / метку.

Вы можете использовать представление отладки, которое обеспечивает Xcodeдля вас, чтобы увидеть такого рода проблемы.Я написал пример, чтобы продемонстрировать вам, как voiceOver видит ваши ярлыки.

Когда вы используете addSubview, ваша иерархия представлений выглядит так:

overview

Так что в этомcase, контейнер, с Hello Stack!ярлык поверх ярлыка Hello World.Как пользователь, вы не можете видеть ярлык Hello World.Однако voiceOver может видеть это представление.

Хорошо, теперь, когда проблема известна, решение заключается в следующем: всякий раз, когда вы хотите добавить представление поверх другого, сначала скрывайте предыдущее представление.Затем используйте Debug View xcode, чтобы увидеть, как выглядят ваши представления.

Я исправлю это, чтобы показать вам, как исправить ошибку, которую я продемонстрировал:

В коде: enter image description here

Отладка:

  • первая метка: postimg.org/image/cabhadzrl/
  • вторая метка: postimg.org/image/nsldgjb41/5605fbcd/

Если вы наблюдаете, я добавил контейнер представления между метками, но это представление просто для улучшения представления об иерархии.

2 голосов
/ 10 января 2014

Использовать это экранное уведомление об изменении

UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil);

если вам нужно сфокусировать конкретный объект / вид, тогда передайте их вместо nil.

...