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

hrirmatl  于 2023-02-14  发布在  iOS
关注(0)|答案(3)|浏览(118)

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

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)
        }
    }
}

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

是否有办法让我知道何时VoiceOver阅读完按钮的accessibilityLabel,然后 * 才 * 调用UIAccessibilityPostNotification?或者是否有办法在用户轻按按钮时禁止VoiceOver再次读取按钮?

一个示例项目可以在这里看到:https://github.com/rajohns08/VoiceOverTest

b5lpy0ml

b5lpy0ml1#

一种可能的方法是将accessibilityLabel的内容分为较短的accessibilityLabel和较长的accessibilityHint。
我认为使用长accessibilityLabel的原因是需要为无法看到屏幕的用户提供有关按钮操作的额外信息。
就像我们喜欢简短的可见按钮标签,以便用户可以“看得快”,画外音用户希望“听得快”,所以保持accessibilityLabel简短是一个好主意,并有突出的话第一,因为阅读标签是中断时,用户继续前进.
如果焦点停留在按钮上的时间足够长,则将读取提示。
用户可以在设置中关闭语音提示,所以如果每次按下按钮时都必须传达信息,那么这个解决方案就行不通了。你可能不得不像FranticRock建议的那样,依靠通知,也许还需要加上调度延迟。
了解用例会很有趣,也许那会引出更多的想法!

lnlaulya

lnlaulya2#

您可以在按钮上设置以下属性,当按钮被单击时,它将不再读取按钮:

button.accessibilityTraits += UIAccessibilityTraitStartsMediaSession

这告诉系统该按钮启动了一个多媒体事件,并且在激活时不应发出任何声音。
Apple的参考文档:https://developer.apple.com/documentation/uikit/uiaccessibilitytraits/1620173-startsmediasession
在您不想中断的媒体会话期间,使用此Trait可将辅助应用(如VoiceOver)的音频输出静音。例如,您可以使用此Trait在用户录制音频时将VoiceOver语音静音。
关于在移动到其他元素之前等待元素完成阅读:我只能通过订阅此通知来了解如何等待公告完成:.UIAccessibilityAnnouncementDidFinish
当系统阅读完如下所示的公告时,这种方法可以正常工作:

UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, title)

但是,我不知道如何等待像LayoutChanged和ScreenChanged这样的东西来完成阅读。他们不发送上述公告通知。如果你能弄清楚,请告诉我。

bjp0bcyl

bjp0bcyl3#

不幸的是我的直觉(一个值得引用的消息来源)说,你不能,也不应该检查和解决任何语音生成的画外音,以回应用户的导航或行动。用户不应该等待通过按钮标签之前,听到激活按钮的结果。也就是说,你可能会重新考虑使用这么长的按钮标签,并包括额外的信息在accessibilityHint,而是在延迟之后读取。

相关问题