使用辅助功能
当 VoiceOver 按顺序读取应用程序中的元素时,有没有办法在元素之间转移焦点?我尝试使用“nextResponder”,但它不起作用。
使用辅助功能
当 VoiceOver 按顺序读取应用程序中的元素时,有没有办法在元素之间转移焦点?我尝试使用“nextResponder”,但它不起作用。
从 iOS 6 开始,您可以使用 a 将焦点设置到特定元素UIAccessibilityLayoutChangedNotification
,传递元素
UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, firstBottom);
但如果你想完全改变“标签顺序”,我不知道有什么办法。
查看这篇文章,了解如何处理用于配音的元素的特殊排序。我刚刚在我正在开发的应用程序中使用了这种方法。
这是在黑暗中拍摄的,但是当您希望更改订单时,您是否尝试过更改accessibilityLabel 或accessibilityHint?如果您可以欺骗 VoiceOver 相信文本已更改,我希望它会适当地更改焦点。
时间安排将是困难的部分,因为当 VoiceOver 爬取您的视图时,似乎没有任何委托回调,因此您可能必须在尝试更新可访问性提示/值之前估计要经过的时间。
我最后的想法是用可访问性特征标记您想要引起注意的 UIView UIAccessibilityTraitUpdatesFrequently
。这可能是您在不利用隐藏的 Apple 库的情况下可以获得的最接近的结果。
我试过UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, elementName); 改变对不同元素的关注。行为是焦点转移到了新元素,但 Voice Over 会首先宣布页面标题,然后是新元素的可访问标签值。
自定义视图的辅助功能:
accessibilityElements
您可以通过以下方式覆盖父视图的属性来自定义顺序(画外音应该遍历屏幕元素) 。
self.accessibilityElements = [childView1, childView2, childView3]
随着那个画外音将遵循像这样的序列childView1 -> childView2 -> childView3
。
以编程方式将辅助功能焦点更改为其他元素:
您可以随时使用以下代码将焦点转移到另一个元素。
UIAccessibility.post(notification: .layoutChanged, argument: childView2)
使用上面的代码,语音焦点将转移到childView2
,然后将遵循accessibilityElements
ie定义的相同顺序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