是否可以为 UILabel 分配可访问性操作?
Posted
技术标签:
【中文标题】是否可以为 UILabel 分配可访问性操作?【英文标题】:Is it possible to assign an accessibility action to a UILabel? 【发布时间】:2016-09-06 18:38:19 【问题描述】:在我们当前的 UI 中,在某些标签旁边,我们有一个帮助提示按钮,当点击该按钮时,会解释标签所引用内容的详细信息。因此,VoiceOver 将这两个项目标识为单独的辅助功能项目。
但是,在使用辅助功能时,我们希望我们可以在标签本身中执行所有操作。这样,当标签获得焦点时,用户将在此处“帐户价值,20 美元(accessibilityLabel),双击寻求帮助(accessibilityHint)”
但是,与按钮不同,标签没有与之关联的操作,因此我不确定如何连接以实际触发可访问性手势,以指示我想要做某事。
除了将我们所有的标签都转换为按钮之外,有什么方法可以监听我们标签上的可访问性“操作”方法吗?
我目前的解决方法是仅使帮助提示按钮可访问,然后将所有相关信息移至其可访问性属性,但这似乎是代码异味,因为开发人员在更新代码时很容易错过这一点。
【问题讨论】:
【参考方案1】:在您的 UILabel
子类中,覆盖 accessibilityActivate()
并实现双击应该做的任何事情:
override func accessibilityActivate() -> Bool
// do things...
return true
如果操作可能失败,则在这些情况下返回 false
。
【讨论】:
有趣。我没有意识到这一点。这适用于标签吗?我会对其进行测试,但现在我无法使用 Mac。 @MarqueIV 是的,我只是在一些标签上使用过它并且可以确认它有效 @MarqueIV :accessibilityActivate
方法非常强大,与您的用例中的 accessibilityActivationPoint
属性一样强大。【参考方案2】:
您是否尝试将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")
【讨论】:
理想情况下,您不会使用 TapGestureRecognizers,因为它们不为无障碍用户提供多种操作选项,并且在您使用 Voice Over 时难以控制。重写 UIAccessibilityCustomActions 是首选方法。 这个可行的解决方案只是一种变通方法,因为本机可访问性工具提供了不同的方法来实现此目标(accessibilityActivate、accessibilityActivationPoint):在其设计的区域中使用适当的工具。 ;o)【参考方案3】:好的,这比我想象的要容易。要使 UILabel 响应类似于按钮的可访问性操作,您只需实现 UITapGestureRecognizer。 Accessibility 框架像任何其他 UIView 一样使用它。
let tapGestureRecognizer = UITapGestureRecognizer(target:self, action:#selector(labelTapped))
testLabel.userInteractionEnabled = true
testLabel.addGestureRecognizer(tapGestureRecognizer)
一旦你这样做了,你的标签就会响应无障碍操作。
【讨论】:
【参考方案4】:将您的标签和提示按钮分组为one unique accessible element。
完成后,您可以使用:
accessibilityActivationPoint
属性定义双击发生时要触发的提示按钮。
accessibilityActivate
方法指示双击新元素时要执行的操作。
根据您的环境,我不建议为这样一个简单的用例实现custom action...上面的两个解决方案应该可以完成这项工作。
【讨论】:
【参考方案5】:绝对!您可以通过在可访问性元素上使用 UIAccessibilityCustomActions
而不是使用轻击手势识别器来做到这一点。这是因为辅助功能的操作方式不同于普通用户和单击,而焦点上的语音落在某处不会像正常使用那样为您提供所需的结果,也不允许您在同一个辅助功能元素上执行多个选项。
在最近的 WWDC 上,Apple 发布了一段出色的视频,解释如何将 UIAccessibilityCustomActions
添加到任何类型的可访问性元素中。如果您在 33 分钟后开始this video,您将能够看到这是如何实现的。
一旦到位,您的 Voice Over 用户将能够滚动选项并选择最适合他/她意图的选项,从而允许从同一个 UILabel 访问多个操作。
【讨论】:
而不是仅仅使用链接,如果你可以在这里展示简单的代码示例,这样你就不必离开网站,更不用说浏览视频了,我会把答案切换到这个,因为看来点击识别器不是推荐的方式。以上是关于是否可以为 UILabel 分配可访问性操作?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在不声明 IBOutlet 属性的情况下访问 IB 对象(例如 UILabel)?
如何使标签文本中的链接可用于语音(可访问性)? (iOS,Xamarin)