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

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

最佳答案

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

button.accessibilityTraits += UIAccessibilityTraitStartsMediaSession

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

关于在移动到其他元素之前等待元素完成阅读:通过订阅此通知,我只能找出如何等待公告完成:.UIAccessibilityAnnouncementDidFinish
当系统完成读出这样发送的通知时,这工作正常:
UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, title)

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

关于iOS VoiceOver 在更改到下一个元素之前等待元素完成阅读,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45578888/

10-14 22:16