阻止VoiceOver将UIButton读取为“可能的文本”

时间:2019-05-24 14:39:57

标签: swift uibutton accessibility voiceover

我正在编写一个非常简单的游戏,专门为盲人用户设计,但也可能被有视力的用户使用。它使用许多按钮作为元素,但是盲人用户通过自定义手势(平移,轻击等)与这些按钮进行交互,因此标准的画外音交互是不合适的。

问题在于,屏幕上根本没有可访问性对象,因此,每当游戏加载时,画外音就会开始读取按钮上的标签(例如,“可能的文本:后退,菜单...”。)不论是否启用了它们,都将被读取。对于盲人用户,我也无法从视图中删除其中的大多数。

我尝试关闭元素的可访问性,取消选中可访问性特征中的“按钮”,所有内容都允许选择直接交互,我尝试了.accessibilityElementsHidden,来自How do you exclude a UIButton from VoiceOver?的所有建议,似乎没有任何作用。 / p>

我当前的解决方案具有一个清晰的UILabel,其中没有文本,将其设置为.accessibilityElements数组中的唯一项,然后出于良好的考虑,我发布了一个具有该标签作为对象的可访问性屏幕更改通知,因此它变为焦点,然后在调用后在异步的分发队列中等待一秒钟,完全删除标签,然后将焦点设置回主视图,以便用户可以进行交互。

这是我当前解决方案的一个示例:

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        self.accessibilityElements = [lblVoiceOver!]
    }

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        UIAccessibility.post(notification: .screenChanged, argument: lblVoiceOver)
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
            self.lblVoiceOver.removeFromSuperview()
            UIAccessibility.post(notification: .screenChanged, argument: self.view)
        }
    }

这充其量是一个愚蠢的破解,我很想实现一个真正的解决方案,该解决方案只是防止画外音读取“可能的文本”。我相信iOS 11中已添加了可能的文本功能,以帮助那些未考虑可访问性的应用程序对可访问性更加友好,但到目前为止,我还没有找到关闭此功能的方法。

1 个答案:

答案 0 :(得分:1)

  

问题在于,屏幕上根本没有可访问性对象。

如果要达到此目的,只需在视图控制器中写self.view.accessibilityElementsHidden = true,该控制器将不再包含VoiceOver的可访问元素:这将表明content of your container isn't accessible

  盲用户通过自定义手势(平移,轻击等)与这些按钮进行交互,因此标准配音交互是不合适的。我想实现一种真正的解决方案,该解决方案只是防止“可能的文本”通过旁白阅读。

...按照上述原理,您应防止VoiceOver分析和读取视图中的任何内容。