iOS 辅助功能 - 有没有办法判断 VoiceOver 何时改变了焦点?

iOS Accessibility - is there a way to tell when VoiceOver has changed focus?

我想在 VoiceOver 处于活动状态时每次聚焦不同的元素时调用一个方法。我本来希望有一些 UIAccessibilityNotification 的,但我似乎找不到。

最终,我的目标是在阅读无障碍标签之前添加一个附加条件。例如,与说(默认)"If UIButton becomes focused: read label" 相反,我希望能够说 "When UIButton becomes focused AND UIButton's background color is blue: read label".

所以我的问题是:如何在阅读标签之前添加附加条件,或者在新元素成为焦点时收到通知?

您无法明确判断用户何时移动了 VoiceOver 光标(就像您无法判断有视力的用户正在看哪里一样)。

对于您想要的行为,您有两个选择:

  1. 每当其他条件发生变化时,将按钮的 accessibilityLabel 设置为适当的值。
  2. 子类 UIButton 并覆盖其 accessibilityLabel getter 方法:

    - (NSString *) accessibilityLabel {
        if (SOME_CONDITION) {
            return @"Hooray!";
        } else {
            return @"Womp womp";
        }
    }
    

如果您需要完全禁用某个项目,而不是返回 nil 或空字符串,您应该将其 accessibilityElementsHidden 属性 设置为 YES

您可以使用 UIAccessibilityFocus 协议来检测辅助功能客户端(包括 VoiceOver)的焦点变化。请注意,UIAccessibilityFocus 是一种非正式协议,每个可访问性元素都必须独立实施。

也就是说,对于您的用例,Aaron 建议在每种情况下返回不同的 accessibilityLabel 是正确的。