如何更改视图控制器中可访问性元素的顺序而不会失去对导航栏的访问权限?

Posted

技术标签:

【中文标题】如何更改视图控制器中可访问性元素的顺序而不会失去对导航栏的访问权限?【英文标题】:How can I change the order of accessibility elements in a view controller without losing access to the navigation bar? 【发布时间】:2019-04-12 20:11:07 【问题描述】:

我有一个视图控制器,它包含一个表格视图以及一些“浮动”控件,这些控件在屏幕底部直观地显示。

当使用 VoiceOver 进行导航时,用户可以按如下方式进行导航:

后退按钮(导航栏) 标题(导航栏) 编辑按钮(导航栏) 浮动按钮 表格内容

但目前,导航顺序是

后退按钮(导航栏) 标题(导航栏) 编辑按钮(导航栏) 表格内容 浮动按钮

当我为视图控制器的视图显式设置可访问性元素以更改顺序时

- (void)viewDidLoad 
  self.accessibilityElements = @[self.floatingButton, self.tableView];

导航顺序变为

浮动按钮 表格内容

并且导航栏不再可访问。

如果我在accessibilityElements 数组的开头包含self.navigationController.navigationBar,那么我会得到导航顺序

后退按钮(导航栏) 标题(导航栏) 编辑按钮(导航栏)

然后再次向右滑动导航回后退按钮,因此我无法到达浮动按钮或表格内容。

有没有办法重新排序可访问的子视图而不会失去对导航栏的访问权限?

【问题讨论】:

【参考方案1】:

我尝试并重现了您在此故事板之后的空白项目中提到的问题: 我阅读了此a11y recommendations site 以提供我实现的代码 sn-p 以使其按需要工作:

class TestButtonTableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 

    @IBOutlet weak var myTableView: UITableView!
    @IBOutlet weak var bottomButton: UIButton!

    override func viewDidLoad() 
        super.viewDidLoad()
        myTableView.delegate = self as UITableViewDelegate
        myTableView.dataSource = self as UITableViewDataSource
    

    override func viewDidAppear(_ animated: Bool) 
        super.viewDidAppear(animated)
        self.accessibilityElements = [bottomButton, myTableView]
    

    func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    

    func tableView(_ tableView: UITableView,
                   numberOfRowsInSection section: Int) -> Int 
        return 2
    

    func tableView(_ tableView: UITableView,
                   cellForRowAt indexPath: IndexPath) -> UITableViewCell 

        return zeCell = tableView.dequeueReusableCell(withIdentifier: "myPersoCell",
                                               for: indexPath)
    

我做了right flicks来获取下一个元素并获得了以下插图: VoiceOver 导航遵循所需的模式:

    返回按钮(导航栏)。 标题(导航栏)。 编辑按钮(导航栏)。 浮动按钮。 表格内容。

我没有特别指定任何内容,并且更改了视图控制器中可访问性元素的顺序,而不会失去对导航栏的访问权限

【讨论】:

嗯。这个应用程序有一个复杂的自定义导航控制器系统,可能会干扰该行为。感谢您在更简单的应用程序中验证行为。当我遵循该模式时,看起来导航几乎可以正常工作。焦点从我的浮动按钮开始,我最初无法向左轻拂以选择导航栏,但如果我向右轻拂以选择表格,然后向左轻拂几次它确实选择了导航栏。调查是否可以使用UIAccessibilityPostNotification初始选择导航栏。 @Greg :如果您发现当前导航栏受到干扰,您可以为 VoiceOver 隐藏它并创建辅助元素以添加到辅助元素数组中,以便根据需要对整个页面进行排序实例...不是一个简单的方法,但如果需要,这可能会有所帮助。 我还没有找到好的解决方案。我希望我们将来能够删除自定义导航控制器系统,这将解决这个问题。

以上是关于如何更改视图控制器中可访问性元素的顺序而不会失去对导航栏的访问权限?的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 中的可访问性问题

UIStackView 可访问性 - 在默认的可访问元素中插入可访问性视图?

Vue.js 3 - 替换/更新反应性对象而不会失去反应性

如何通过方向更改控制视图可见性(可见/不可见)? [复制]

重新排序单元格后如何更改获取结果控制器数组中对象的顺序

滑动切换焦点辅助元素 iOS