UIAccessibilityNotificationQuestion

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

- (IBAction)announce:(id)sender {
    UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification,
                                @"Speak this out loud");
}

Насколько я понимаю, когда вы нажимаете кнопку, голос за кадром будет читать «Произнесите это вслух», но вместо этого он читает название кнопки. Может ли кто-нибудь сказать мне, что не так с кодом или почему я использую его неправильно?

И чтобы было понятно, я дважды нажал на кнопку. Когда вы один раз нажимаете кнопку, он читает название кнопки и черту («кнопка»), а когда вы дважды нажимаете на нее, он просто читает имя кнопки.

Благодаря ответу @ChrisCM. Поставьте задержку на объявление, это сработает.

@IBAction func announce(sender: AnyObject) {
    let dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(2 * Double(NSEC_PER_SEC)))

    dispatch_after(dispatchTime, dispatch_get_main_queue(), {
         UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, "Item added to cart")
    })
}

Но здесь все еще есть небольшая проблема: после нажатия кнопки «Добавить в корзину» закадровый голос будет нацелен на первый доступный элемент, которым является кнопка «Назад», и будет читать «кнопка «Назад», а затем читать аргумент извещения об объявлении.


person Ke MA    schedule 30.11.2015    source источник
comment
Когда на устройстве включены специальные возможности (закадровый голос), вам нужно дважды нажать кнопку, чтобы выполнить действие.   -  person rmaddy    schedule 01.12.2015
comment
@rmaddy Спасибо за ответ! Да, я дважды щелкнул кнопку, но она читала имя кнопки вместо аргумента, который я передал методу postNotification :(   -  person Ke MA    schedule 01.12.2015
comment
Вы не должны развивать вопросы. Добавление нового разъясняющего контента — это нормально, но если вы решили проблему, которую изначально задавали, и она привела к новым проблемам, вы должны принять ответ и задать новый вопрос.   -  person ChrisCM    schedule 04.12.2015


Ответы (2)


Ваше понимание того, как работает уведомление, верно, однако ваше понимание того, как закадровый голос обрабатывает базовое взаимодействие, неверно. Когда вы публикуете свое объявление, оно запускается, но немедленно прерывается стандартным голосовым ответом на взаимодействие с пользовательским интерфейсом, который должен объявить метку доступности того, что было нажато. Разместите свое объявление после достаточной задержки или на основе чего угодно, кроме клика.

Для второй части вашей проблемы (первой проблеме доступности уделяется особое внимание). Вероятно, это происходит из-за некоторой перерисовки экрана, поэтому неотъемлемая UIAccessibilityScreenChangedNotification публикуется иерархией рисования вида. Вы должны переопределить это, разместив это уведомление самостоятельно с элементом, который вы предпочитаете выделить. Вероятно, либо элемент, инициировавший изменение экрана, либо новый контент, добавленный в результате этого взаимодействия.

person ChrisCM    schedule 01.12.2015
comment
Спасибо за ваш ответ! Делаю там задержку и она работает! Просто интересно, можно ли отключить определенный стандартный голосовой ответ на взаимодействие с пользовательским интерфейсом? Немного странно снова слышать название кнопки, прежде чем получить отзыв, спасибо! - person Ke MA; 01.12.2015
comment
Нет, ты не можешь. Вы должны обновить свой код, чтобы мы могли видеть, как вы сообщили о задержке. - person ChrisCM; 01.12.2015
comment
Вот хорошая тема о том, как добавить задержку: stackoverflow.com/questions/4139219/ - person Rudolf Real; 10.02.2017

На основе ответа выше ChrisCM реализовано следующее:

if UIAccessibility.isVoiceOverRunning {
    DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
        UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, "message")
    }
}
person Vinayak    schedule 03.01.2019