我有一个按钮可以切换显示的标签:
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/