是否可以将可访问性操作分配给 UILabel?

Is it possible to assign an accessibility action to a UILabel?

在我们当前的 UI 中,在某些标签旁边,我们有一个帮助提示按钮,单击该按钮会解释标签引用内容的详细信息。因此,VoiceOver 将这两项识别为单独的辅助功能项。

但是,在使用辅助功能时,我们希望我们可以在标签本身中完成所有操作。这样当标签获得焦点时,用户将在这里 'Account value, (the accessibilityLabel), double-tap for help (the accessibilityHint)'

但是,与按钮不同,标签没有与之相关联的操作,因此我不确定如何连接实际触发可访问性手势以指示我想做某事。

如果不将我们所有的标签都转换为按钮,是否有任何方法可以在我们的标签上监听可访问性 'action' 方法?

我目前的解决方法是只使帮助提示按钮可访问,然后将所有相关信息移动到它们的可访问性属性,但这看起来像代码味道,因为开发人员在更新代码。

您尝试过将 UITapGestureRecognizer 添加到 Labels 吗?

类似于:

let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "tapResponse:")
    tapGesture.numberOfTapsRequired = 1
    sampleLabel.userInteractionEnabled =  true
    sampleLabel.addGestureRecognizer(tapGesture)

func tapResponse(recognizer: UITapGestureRecognizer) {
    print("tap")
}

好的,这比我想象的要容易。要使 UILabel 响应类似于按钮的可访问性操作,您只需实现 UITapGestureRecognizer。 Accessibility 框架就像使用任何其他 UIView 一样使用它。

    let tapGestureRecognizer = UITapGestureRecognizer(target:self, action:#selector(labelTapped))
    testLabel.userInteractionEnabled = true
    testLabel.addGestureRecognizer(tapGestureRecognizer)

完成后,您的标签将响应辅助功能操作。

在您的 UILabel 子类中,覆盖 accessibilityActivate() 并实现双击应该执行的操作:

override func accessibilityActivate() -> Bool {
    // do things...
    return true
}

如果操作失败,return false 在这些情况下。

当然!您可以通过在可访问性元素上使用 UIAccessibilityCustomActions 而不是使用点击手势识别器来执行此操作。这是因为可访问性的操作方式与普通用户不同,当焦点落在某处时单击一次不会像正常使用那样为您提供所需的结果,也不允许您在同一个可访问性元素上执行多个选项。

在最近的 WWDC 上,Apple 发布了一段精彩的视频,解释了如何将 UIAccessibilityCustomActions 添加到任何类型的辅助功能元素。如果您在 this video 33 分钟后开始,您将能够看到这是如何实现的。

设置好后,您的 Voice Over 用户将能够滚动选项和 select 最适合 his/her 意图的选项,从而允许从同一个 UILabel 访问多个操作.

将您的标签和提示按钮分组为 one unique accessible element

完成后,您可以使用:

根据您的环境,我不建议为这样一个简单的用例实施 custom action...上面的两个解决方案应该可以完成工作。