iOS VoiceOver wait on element to finish reading before changing to next element

时间:2017-08-08 22:20:38

标签: ios accessibility voiceover uiaccessibility

I have a button that can toggle a label being shown:

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

When tapping the button, if the label is shown I activate the label to be read by VoiceOver. The problem is VoiceOver automatically starts reading the button's accessibilityLabel when the user taps the button. This results in VoiceOver reading half of the button's accessibilityLabel before swapping to reading the label's accessibilityLabel (e.g. "You can tap this really...This is a label").

Is there a way I can know when VoiceOver is done reading the button's accessibilityLabel and only then call UIAccessibilityPostNotification? Or is there a way to disable the button from being read again by VoiceOver when the user taps the button?

An example project can be seen here: https://github.com/rajohns08/VoiceOverTest

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您可以在按钮上设置以下属性,并且在单击按钮时它将不再再次读出按钮:

button.accessibilityTraits += UIAccessibilityTraitStartsMediaSession

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

关于等待元素完成阅读然后再移至其他元素:我只能通过订阅以下通知来找出如何等待公告完成:.UIAccessibilityAnnouncementDidFinish

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

UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, title)

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

答案 2 :(得分:0)

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

我认为使用accessibilityLabel的时间较长是因为需要为看不见屏幕的用户提供有关按钮操作的更多信息。

就像我们喜欢使用简短的可见按钮标签一样,以便看到用户可以“快速看到”,配音用户希望“快速听到”,因此,最好保持accessibilityLabel简短,自阅读以来首先使用显眼的单词当用户继续前进时,标签会被打断。

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

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

知道用例会很有趣,也许这将导致更多的想法!