swift 如何将多个辅助功能通知排队以获得旁白?

smdnsysy  于 5个月前  发布在  Swift
关注(0)|答案(4)|浏览(59)

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

UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, cell)

字符串
问题是,当我发送多个通知时,已经在阅读的通知会被中断!我希望能够将其排队.
我还发现在另一个问题中,我应该使用属性化字符串:

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


我错过了什么?

kyvafyod

kyvafyod1#

我错过了什么?
我做了很多测试,试图理解这种让我发疯的行为。
我的结论是,如果您在VoiceOver说出{label / hint / value}时发送通知,则不会考虑您的通知:当系统需要说出焦点元素的属性时,可能会有一种抢占。
只有在发声结束时,您才可以发布尽可能多的通知,以便根据您的意愿进行良好的分析和解释。
UIAccessibilitySpeechAttributeQueueAnnouncement键仅在系统不需要接管时对您自己的通知有用。
例如,如果您发送了许多通知,并且用户通过轻弹来聚焦一个新元素,那么一旦系统发声元素的属性,没有发声的通知就会被删除。
在这种情况下,如果你捕捉到UIAccessibilityAnnouncementDidFinish事件,你将得到一个false值,其中最后一个发声通知(UIAccessibilityAnnouncementKeyStringValue)的UIAccessibilityAnnouncementKeyWasSuccessful键.
结论:当出现新的焦点元素或屏幕/布局更改通知时,旁白不会考虑任何个人通知
如何将多个辅助功能通知排队以获得旁白?
根据上面暴露的内容,我建议设置一种重试机制,它仍然会发送你的通知 (x次),而它们在y秒后没有被完全接收。
这可能是一个棘手的方式,以更确定的通知是无故障接收。
️2023/12/15**编辑️

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

ruyhziif

ruyhziif2#

在Swift 5中,这对我来说很有用:

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

字符串
关键是要设置. accessibilitySpeechcodeAnnouncement为true。

sqougxex

sqougxex3#

UIAccessibilityAnnouncementNotification应该在应用程序需要向用户发出临时通知时使用。它可能不是为了重复调用而设计的。
如果您确实想排队,您可能需要发布第一个通知,然后等待系统发布UIAccessibilityAnnouncementDidFinishNotification,然后您可以发布队列中的下一个消息。
(But我想提醒一下:这真的是一个视力受损的用户所期望的吗?)

sc4hvdpw

sc4hvdpw4#

您可以尝试使用https://github.com/spanage/AccessibilityAnnouncer来发送通知,但请记住,如果用户点击并与屏幕交互,这些通知将被忽略。

相关问题