如何获得可访问性滑动以正确导航子视图集合?

Posted

技术标签:

【中文标题】如何获得可访问性滑动以正确导航子视图集合?【英文标题】:How can I get an accessibility swipe to navigate a collection of subviews correctly? 【发布时间】:2013-06-25 16:55:04 【问题描述】:

Apple 打算用一个滑动手势按顺序在屏幕项目中移动 VoiceOver 光标,但我没有这样做,因为用户可以四处移动它们!

我的主视图有一组按钮和标签,但它也有两个自定义子视图集合,让我们从左到右按“升序”调用实例 SVA1 到 SVA9 和 SVB1 到 SVB9。也就是说,SVA 是一个自定义 UIView 类,而 SVB 是第二个。例如,当我将 SVA3 拖动到 SVA6 的当前位置时,我最终会得到 SVA1、SVA2、SVA4、SVA5、SVA3、SVA6、SVA7、SVA8 和 SVA9 的顺序。这些集合是“链接”的,因此现在也可以通过我的代码在 SVB 子视图集合中镜像相同的订单。

我的问题是向右滑动,期望 VoiceOver 在我在屏幕上看到我的项目时读出我的项目会导致不同的顺序。它得到了相当多的权利,但随后会突然将 VoiceOver 光标从第一个集合移动到第二个集合或改变它的方向。移动后,我的代码知道所有子视图的新顺序,但我希望能够将该信息传递给 VoiceOver。

每个自定义子视图都是一个accessibilityElement。有没有办法让 VoiceOver 按我期望的顺序读回我的项目?我遇到了 -accessibilityElementAtIndex: 方法,但不知道它是否或如何适合我的情况。

谢谢。

【问题讨论】:

【参考方案1】:

如果您想更改顺序,那么accessibilityElementAtIndex:UIAccessibilityContainer 协议的其余部分就是您要找的。​​p>

假设您有一个名为 accessibleElements 的数组,它按照您希望它们出现的顺序存储元素。

- (NSInteger)accessibilityElementCount 
    return self.accessibleElements.count;


- (id)accessibilityElementAtIndex:(NSInteger)index 
    return self.accessibleElements[index]; 


- (NSInteger)indexOfAccessibilityElement:(id)element 
    return [self.accessibleElements indexOfObject:element];

容器本身不能是可访问性元素,因此您还应该覆盖 isAccessibilityElement

- (BOOL)isAccessibilityElement 
    return NO;

【讨论】:

ios 8 开始,您可以直接设置对象的 accessibilityElements 而无需覆盖 accessibilityElementCount|ElementAtIndex:|IndexOfElement:

以上是关于如何获得可访问性滑动以正确导航子视图集合?的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 中的可访问性问题

UIPageViewController 可访问性或画外音

markdown 改进子菜单导航的键盘可访问性

如何防止可访问性画外音读出集合视图中选定的单元格位置?

自定义 UITableViewCell 可访问性

自定义后退按钮的可访问性