iOS VoiceOver 等待元素完成阅读,然后再切换到下一个元素

Posted

技术标签:

【中文标题】iOS VoiceOver 等待元素完成阅读,然后再切换到下一个元素【英文标题】:iOS VoiceOver wait on element to finish reading before changing to next element 【发布时间】:2017-08-08 22:20:38 【问题描述】:

我有一个可以切换显示标签的按钮:

class ViewController: UIViewController 
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var button: UIButton!

    override func viewDidLoad() 
        super.viewDidLoad()
        button.accessibilityLabel = "You can tap this really long string that i'm testing"
        label.accessibilityLabel = "This is a label"
    

    @IBAction func buttonTapped(_ sender: UIButton) 
        label.isHidden = !label.isHidden
        if !label.isHidden 
            UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, label)
        
    

点击按钮时,如果显示标签,我会激活 VoiceOver 读取的标签。问题是当用户点击按钮时,VoiceOver 会自动开始读取按钮的accessibilityLabel。这会导致 VoiceOver 在切换到读取标签的 accessibilityLabel 之前读取按钮的一半 accessibilityLabel(例如,“你可以点按这个真的……这是一个标签”)。

有什么方法可以让我知道 VoiceOver 何时完成读取按钮的 accessibilityLabel 并且只有 然后 调用 UIAccessibilityPostNotification?或者有没有办法在用户点击按钮时禁止 VoiceOver 再次读取按钮?

可以在此处查看示例项目:https://github.com/rajohns08/VoiceOverTest

【问题讨论】:

请问这些答案是否为您的问题提供了合适的解决方案? ?????? 【参考方案1】:

你可以在按钮上设置如下属性,当按钮被点击时不再读出按钮:

button.accessibilityTraits += UIAccessibilityTraitStartsMediaSession

这告诉系统该按钮启动一个多媒体事件,并且在激活时它不应该说出任何内容。

关于在移动到其他元素之前等待元素完成阅读:我只能通过订阅此通知了解如何等待公告完成:.UIAccessibilityAnnouncementDidFinish

当系统读完这样发送的公告时,效果很好:

UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, title)

但是,我无法弄清楚如何等待 LayoutChanged 和 ScreenChanged 等内容才能完成阅读。他们不发送上述公告通知。如果你能弄清楚,请告诉我。

【讨论】:

一些关于 VoiceOver 公告结束的信息,如果需要的话 ⟹ ***.com/a/52459406/3825084 ?【参考方案2】:

不幸的是,我的直觉(一个非常可引用的来源)说您不能也不应该检查和解决 VoiceOver 为响应用户导航或操作而生成的任何语音。在听到激活按钮的结果之前,用户不必等待按钮标签。也就是说,您可能会重新考虑使用如此长的按钮标签,并在 accessibilityHint 中包含额外信息,而不是在延迟后读取。

【讨论】:

... 除非用户自己在设置中未激活提示(设置-辅助功能-VoiceOver-Verbosity-SpeakHints)。 ?【参考方案3】:

一种可能的方法是将accessibilityLabel 的内容拆分为更短的accessibilityLabel 和更长的accessibilityHint。

我认为长accessibilityLabel 的原因是需要为看不到屏幕的用户提供有关按钮操作的额外信息。

就像我们更喜欢简短的可见按钮标签,以便看到用户可以“快速看到”,画外音用户希望“快速听到”,所以保持accessibilityLabel 简短,并首先具有显着词是个好主意,因为阅读当用户继续前进时,标签会被打断。

如果焦点在按钮上停留足够长的时间,则会读取提示。

用户可以在设置中关闭语音提示,因此如果每次按下按钮时都传递信息至关重要,那么此解决方案将不起作用。正如 FranticRock 所建议的那样,您可能不得不依赖公告,也许再加上调度延迟。

了解用例会很有趣,也许这会带来更多想法!

【讨论】:

以上是关于iOS VoiceOver 等待元素完成阅读,然后再切换到下一个元素的主要内容,如果未能解决你的问题,请参考以下文章

如何让 VoiceOver 在 iOS 中宣布部分标签?

iOS上的VoiceOver在父元素可见后没有将焦点放在子元素上

在 iOS 上模拟 VoiceOver 辅助功能点击

ios辅助功能之voiceover实战

是否可以在 iOS 应用中启用或禁用 VoiceOver?

VoiceOver 辅助功能专注于一系列元素