使用辅助功能
当 VoiceOver 按顺序读取应用程序中的元素时,是否有任何方法可以在元素之间转移焦点?我尝试使用"下一个响应者",但它不起作用。
从 iOS 6 开始,您可以使用 UIAccessibilityLayoutChangedNotification
将焦点设置为特定元素,传递元素
UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, firstBottom);
但是,如果您尝试完全更改"Tab 键顺序",我不知道有什么方法可以做到这一点。
黑暗中的镜头,但是您是否尝试过根据您希望更改顺序时更改辅助功能标签或辅助功能提示?如果你能欺骗画外音相信文本已经改变,我希望它会适当地改变焦点。
时间安排将是困难的部分,因为当 VoiceOver 抓取您的视图时,似乎没有任何委托回调,因此您可能需要估计经过的时间,然后才能尝试更新辅助功能提示/值。
我的最后一个想法是用UIAccessibilityTraitUpdatesFrequently
可访问性特征标记您想要引起注意的 UIView。这可能是您在不利用隐藏的Apple库的情况下可以获得的最接近的。
查看这篇文章,了解如何处理配音元素的特殊排序。我只是在我正在开发的应用程序中使用了这种方法。
我尝试了UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification,elementName); 来更改不同元素的焦点。行为是焦点转移到新元素,但 Voice Over 将首先播报页面标题,然后播报新元素的可访问标签值。
自定义视图的辅助功能:
您可以通过以下方式覆盖父视图的属性来自定义顺序(画外音应遍历屏幕元素accessibilityElements
)。
self.accessibilityElements = [childView1, childView2, childView3]
有了那个画外音,就会像childView1 -> childView2 -> childView3
一样遵循序列。
以编程方式将辅助功能焦点更改为其他元素:
您可以随时使用以下代码将焦点转移到另一个元素。
UIAccessibility.post(notification: .layoutChanged, argument: childView2)
使用上面的代码,焦点语音将转移到childView2
,然后遵循accessibilityElements
定义的相同顺序,即 childView2 -> childView3 -> childView1... and so on
自定义复杂视图的辅助功能顺序:
您可以进一步自定义它,如果视图具有多个子视图以及更多子视图,则可以通过使用所有子视图accessibilityElements
定义主父视图的accessibilityElements
来实现辅助功能顺序。
例如,对于下面的视图层次结构,我们有
视图控制器示例
要为此类视图定义可访问性元素的自定义顺序,我们可以通过以下方式定义。
var customElements = childView1.accessibilityElements
customElements.append(contentsOf: childView2.accessibilityElements)
customElements.append(contentsOf: childView3.accessibilityElements)
parentView.accessibilityElements = customElements