Как поставить в очередь несколько уведомлений о специальных возможностях для VoiceOver?

Вот как я уведомляю систему о считывании моих элементов:

UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, cell)

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

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

attributedString.addAttribute(NSAttributedStringKey(
    rawValue: UIAccessibilitySpeechAttributeQueueAnnouncement), 
    value: true, 
    range: range!.nsRange)

Что мне здесь не хватает?


person P. Sami    schedule 07.08.2018    source источник


Ответы (4)


Что мне здесь не хватает?

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

Я пришел к выводу, что если вы отправите уведомление, когда VoiceOver произносит {метку/подсказку/значение}, ваше уведомление не будет принято во внимание: может быть своего рода упреждение, когда системе необходимо озвучить атрибут сфокусированного элемент.

Вот только в конце вокализации вы можете опубликовать столько уведомлений, сколько хотите, чтобы их хорошо проанализировали и интерпретировали, как вы хотите.

Клавиша UIAccessibilitySpeechAttributeQueueAnnouncement полезна только с вашими собственными уведомлениями, когда системе не нужно вступать во владение.

Если вы отправляете много уведомлений и пользователь щелкает, чтобы, например, сфокусироваться на новом элементе, уведомления, которые не были озвучены, будут удалены, как только система озвучит атрибуты элемента.

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

Вывод . VoiceOver не учитывает персональные уведомления, когда появляется новый элемент в фокусе или уведомление об изменении экрана/макета.

Как поставить в очередь несколько уведомлений о специальных возможностях для VoiceOver?

В соответствии с тем, что было показано выше, я предлагаю настроить своего рода механизм повторных попыток, который по-прежнему будет отправлять ваши уведомления (x раз), хотя они не будут получены полностью через y секунд. например.
Это может быть сложным способом убедиться, что уведомления доставляются безупречно.

person XLE_22    schedule 22.09.2018

С Swift 5 это работает для меня:

if (UIAccessibility.isVoiceOverRunning) {
     let message: NSAttributedString = NSAttributedString(string: "read me", attributes: [.accessibilitySpeechQueueAnnouncement: true])
     UIAccessibility.post(notification: .announcement, argument: message)
}

Ключевым моментом является установка .accessibilitySpeechQueueAnnouncement true.

person Mark Phillips    schedule 12.06.2021

UIAccessibilityAnnouncementNotification предполагается использовать, когда приложению необходимо сделать специальное объявление для пользователя. Вероятно, он не предназначен для многократного вызова.

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

(Но я хотел бы предостеречь: действительно ли это то, что будет ожидать слабовидящий пользователь?)

person Matthew    schedule 07.08.2018
comment
Я пытался слушать UIAccessibilityAnnouncementNotification, но он никогда не вызывается, когда я публикую уведомление для объявления... - person P. Sami; 08.08.2018
comment
Причина, по которой нам нужно сделать объявление, заключается в том, что это для сеанса чата (когда другая сторона отвечает, мы должны уведомить об этом как об объявлении). - person P. Sami; 08.08.2018

Вы можете попробовать использовать https://github.com/spanage/AccessibilityAnnouncer для собственных уведомлений, но не Имейте в виду, что если пользователь нажимает на экран и взаимодействует с ним, эти уведомления будут игнорироваться.

person Aaron Stephenson    schedule 11.11.2019