将 UIView.isAccessibleElement 设置为 true 会禁用在画外音模式下点击子视图

Setting UIView.isAccessibleElement to true disables clicking of subview in voiceovermode

所以我有一个自定义视图控制器,它显示一个带有几个按钮的对话框。 当视图出现时,我希望画外音读出一些描述对话框的基本信息。 为实现这一点,我将父视图设为可访问元素,而作为两个按钮的子视图也是可访问元素。 我现在的问题是按钮不能直接点击。 只有在屏幕上向右滑动才能到达它们。

class MyViewController: UIViewController {
    let parent = UIView()
    let button1 = UIButton()
    let button2 = UIButton()

    init() {
        parent.addSubview(button1)
        parent.addSubview(button2)
        parent.isAccessibilityElement = true
        button1.isAccessibilityElement = true
        button2.isAccessibilityElement = true
        parent.accessibilityLabel = "Message"
        self.view.addSubview(parent)
        self.view.accessibilityElements = [parent, button1, button2]
    }

    override func viewDidAppear(_ animated: Bool) {
    }
}

如果有更好的方法让画外音在打开时描述视图,我也愿意。

此外,视图需要是模态的,以便焦点被困在视图上。

您可以post a notification将消息作为参数,这样您就不需要将父视图设置为无障碍元素。这将解决您的两个问题。

示例代码:

    let parentVc = UIView()
    let button1 = UIButton()
    let button2 = UIButton()

    init() {

        parentVc.addSubview(button1)
        parentVc.addSubview(button2)
        button1.setTitle("btn1", for: .normal)
        button2.setTitle("btn2", for: .normal)

        button1.isAccessibilityElement = true
        button2.isAccessibilityElement = true

        self.view.addSubview(parentVc)
        self.view.accessibilityElements = [button1, button2]

        UIAccessibility.post(notification: UIAccessibility.Notification.screenChanged, argument: "Message here");
    }

To achieve this I made the parent view to be an accessible element and the subviews which are two buttons are also accessible elements.

这绝对是问题所在:您无法同时访问 parent 视图及其 children ⟹ 请参阅示例 sheet this explanation.
如果 parent 视图可访问,其 children 将不会被 VoiceOver 看到,反之亦然。

If there is a better way to get voiceover to give description of the view when the opens, I am open to that too.

使用 VoiceOver,您必须尽可能准确和简短。
当您浏览屏幕时,视图的描述由它的元素或它的标题本身提供:在我看来,您不应该读出 完美标题 应该提供的描述除了正确实施页面的不同组件

有一个 great presentation 由盲人制作,他解释了如何在应用程序中编写标签以便更好地理解。

Also, the view needs to be a modal so that focus is trapped on the view.

达到此目的的最佳方法是 使用在 WWDC session 期间引入的 accessibilityViewIsModal property of your view ⟹ take a look at this example 如果需要的话。