如何对 VoiceOver 的多个辅助功能通知进行排队?

问题描述 投票:0回答:4

这就是我通知系统读出我的元素的方式:

UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, cell)

问题是,当我发送多个通知时,已经在阅读的通知会被中断!我希望能够排队...

我还在另一个问题中发现我应该使用属性字符串:

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

我在这里缺少什么?

ios swift uiaccessibility
4个回答
11
投票

我在这里缺少什么?

我做了很多测试来尝试理解这种让我发疯的行为。

我的结论是,如果您在 VoiceOver 说出{标签/提示/值}时发送通知,您的通知将不会被考虑:当系统需要说出某个属性的属性时,可能会出现某种抢占。聚焦元素。

只有在发声结束时,您才能发布任意数量的通知,以便根据您的意愿进行充分分析和解释。

UIAccessibilitySpeechAttributeQueueAnnouncement
键仅在系统不需要接管时对您自己的通知有用。

如果您发送了许多通知,并且例如用户轻弹以聚焦新元素,则系统一旦朗读该元素的属性,未朗读的通知将被删除。

在这种情况下,如果您捕获

UIAccessibilityAnnouncementDidFinish
事件,您将在最后一个发声通知 (
UIAccessibilityAnnouncementKeyWasSuccessful
) 中使用
UIAccessibilityAnnouncementKeyStringValue
键获得错误值...以下所有内容都将被忽略,且不会给出任何信息由观察者。

结论:当出现新的焦点元素或屏幕/布局更改通知时,VoiceOver 不会考虑任何个人通知

如何对 VoiceOver 的多个辅助功能通知进行排队?

根据上面暴露的内容,我建议设置一种重试机制,即使在y秒后仍未完全收到通知,该机制仍会发送通知(x次)
这可能是一种更确定通知是否被完美接收的棘手方法。

⚠️ 编辑 2023/12/15 ⚠️

iOS 17 中引入了一些新的优先事项,您可能会对这个主题感兴趣。 😉


9
投票
对于 Swift 5,这对我有用:

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


1
投票

UIAccessibilityAnnouncementNotification

。它可能不是为了重复调用而设计的。

如果您确实想要排队,您可能需要发布第一个通知,然后等待系统发布

UIAccessibilityAnnouncementDidFinishNotification

,然后您可以在队列中发布下一条消息。

(但我要小心:这真的是视障用户所期望的吗?)


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.