【问题标题】:How to setup accessibility containers so that gestures work properly?如何设置可访问性容器以使手势正常工作?
【发布时间】:2021-04-18 19:02:31
【问题描述】:

我有一个具有这种布局的视图控制器(注意黄色和表格视图是同级的):

我希望黄色视图充当容器,所以我在 viewDidLoad 中这样做:

yellowView.isAccessibilityElement = true
view.accessibilityElements = [yellowView!, tableView!]

在 Voice Over 中,我从辅助功能转子中选择“容器”,并希望能够上下滑动以从黄色视图移动到表格视图并再次返回:

黄色(向下滑动)→ TableView(向下滑动)→ Tabbar(向上滑动)→ tableView(向上滑动)→ 黄色

但是,情况并非如此 - 在tableView 获得焦点后,向上滑动不会将焦点移至黄色视图,它只会停在那里。向下滑动,移动到标签栏 - 我的自定义视图似乎被忽略为容器。

我已经尝试了许多添加超级视图并为它们设置isAccessibilityElement = false 的组合,但似乎没有任何效果。

有人知道怎么解决吗?

【问题讨论】:

    标签: ios cocoa-touch accessibility voiceover uiaccessibility


    【解决方案1】:

    似乎我的自定义视图被忽略为容器。

    显然,只有原生元素可以被识别为转子的容器。?
    我尝试通过在定义为其容器的视图中创建一个UIAccessibilityElement 并使用accessibilityContainerType 但没有结果。?

    我从不将转子与容器项目一起使用,但这个问题引起了我的好奇心。 ?
    我调查了这个问题并发现了一个interesting answer,它突出显示了所有本机容器的相同 a11y 特征值……至少那些被 VoiceOver 分析的容器。

    覆盖特定容器的特征值,例如:

    override var accessibilityTraits: UIAccessibilityTraits {
        get { return UIAccessibilityTraits(rawValue: 0x200000000000) }
        set {  }
    }
    

    这是一种解决方法,因为似乎没有为自定义容器做任何其他事情,但我不喜欢使用可能会更改或可能不会在未来版本中使用的原始值。

    无论如何,按照这个原理,您现在可以设置辅助功能容器,以便手势与 VoiceOver 转子一起正常工作。 ?

    【讨论】:

    • 嗯,它确实有效,但正如你所说,我会对在生产中使用它保持警惕。非常感谢您的回答 - 我会将其标记为正确,因为目前似乎没有其他解决方案..