在iOS中,setAccessibilityLabel和accessibilityIdentifier有什么区别?

55

我一直在查看我们的代码库,并在所有按钮和文本字段上设置accessibilityIdentifier属性,以便我可以使用UIAutomation访问它们。 在这样做时,我发现已经存在一些代码。

[_goodButton setAccessibilityLabel:@"off"];

我找不到关于这两种方法的区别的任何文档。看起来它们做的事情是一样的。有人知道吗?我觉得奇怪的是这个标签也被设置为“off”。

4个回答

115
这两个属性确实容易混淆。我自己也曾掉入同样的陷阱,但是通过使用VoiceOver和UI Automation测试进行研究和实验后,发现它们之间存在明显的区别。

accessibilityLabel
这是由VoiceOver读取给最终用户或通过其他可访问性工具公开的值。因此,这应该是本地化字符串。最好将其保留为单个单词,如果可能的话,描述它是什么(例如,“帮助”,“播放”,“新注释”等)。它还应以大写字母开头,但不要以句点结尾。这有助于VoiceOver发音的清晰。

由于这是面向最终用户的,作为用户测试的一部分,开发人员可能需要根据需要更改此值以使其更清晰。例如,它可能会从“播放”更改为“读取评论”。因此,您不希望将其与自动化测试绑定在一起,因为这样的更改将破坏任何引用现在不存在的“播放”标签的测试。这就是accessibilityIdentifier起作用的地方。

accessibilityIdentifier
虽然accessibilityLabel面向最终用户,但accessibilityIdentifier则面向开发人员,主要用于识别可访问元素以进行UI自动化和测试工具。因此,它不应本地化。

开发人员应该使用在UI测试上下文中有意义的值,而不是针对最终用户的值。例如,显示帮助主题的按钮可以具有标识符“HelpButton”,因为这清楚地说明了其所标识的内容,但不是最终用户需要接触到的内容。

养成使用此值的习惯!这样做可以确保您的UI自动化测试永远不会由于本地化或更改accessibilityLabel而中断。

accessibilityHint(包括完整性)
此属性提供给终端用户一个关于控件预期操作或行为的简短附加信息。它通常是一个短语,描述该控件的作用(例如,“按两次快门以拍摄照片”)。与accessibilityLabel不同,此属性是可选的。如果存在,则应本地化,并遵循适当的大小写和标点符号约定。

accessibilityHint 用于在accessibilityLabel本身不够清晰的情况下提供额外上下文。由于accessibilityLabel应该尽可能保持一个单词,因此accessibilityHint可以提供附加的上下文信息。然而,如果accessibilityLabel本身已经足够表达,您应该将accessibilityHint留空。

如果确定需要使用accessibilityHint,请将其简化为一个短句片段,首字母大写并以句号结尾。它应该描述它所做的事情,而不是告诉您该怎么做(例如,“Plays the current track.”而不是“Play the current track.”,因为后者听起来像是一条指令,而不是告诉您会发生什么)

VoiceOver在阅读标签后暂停一小段时间,然后读取提示(例如“Play... Plays the current track.”)。如果用户禁用提示,当然只会说“Play”。

希望这有所帮助!


3
请注意,即使给出提示,用户也可以(并且经常会)禁用提示,因此只需在需要时提供提示。 - Allison
2
很好的解释! - nahung89
感谢@nahung89!我尝试以我想看到的方式来编写我的答案...以帮助自己和其他人学习。很高兴你同意! :) - Mark A. Donohoe

36

使用 accessibilityIdentifier 替代 accessibilityLabel (请参见下面)。

这个 github 问题 解释了它们之间的区别:

考虑到 accessibilityLabel 是一个向外展示的字符串,实际上被无障碍屏幕阅读器使用(并且应该翻译为设备用户的语言),Apple 现在提供了一种专门用于 UI 自动化目的的备选属性(iOS 5+)


2
虽然这理论上可以回答问题,但最好在此处包含答案的必要部分,并提供参考链接。 - GS - Apologise to Monica

6
可访问性标签和标识属性 label 属性和 identifier 属性在脚本访问 UI 元素的能力中起着重要作用。理解它们的用法很重要。
为 label 属性设置一个有意义的值是可选的,但建议这样做。您可以在 Interface Builder 的 Identity inspector 的 Accessibility 部分的 Label 文本字段中设置和查看标签字符串。该标签应具有描述性,但长度较短,部分原因是辅助技术(如 Apple 的 VoiceOver)将其用作关联 UI 元素的名称。在 UI 自动化中,此标签通过 label 方法返回。如果 identifier 属性未设置,则默认情况下,name 方法也会返回此标签。详细信息请参阅 UIAccessibilityElement 类参考。
identifier 属性允许您对元素使用更具描述性的名称。它是可选的,但必须为脚本设置才能执行以下两个操作之一:
- 通过名称访问容器视图,并能够访问其子元素。 - 通过名称访问 UILabel 视图以获取其显示的文本(通过其 value 属性)。 在 UI 自动化中,如果设置了 identifier 属性,则 name 方法返回此标识属性的值。如果未设置,则 name 方法返回 label 属性的值。

目前,你只能通过编程方式设置标识属性的值,通过 accessibilityIdentifier 属性。有关详情,请参阅 UIAccessibilityIdentification Protocol Reference。


2
AccessibilityLabel是供VoiceOver朗读给最终用户的值。因此,它应该是本地化字符串。文本也应大写,因为这有助于VoiceOver的发音。accessibilityLabel用于测试和视觉障碍用户。 AccessibilityIdentifier通过辅助功能标识元素,但与accessibilityLabel不同,accessibilityIdentifier的目的纯粹是作为UI自动化测试的标识符使用。我们使用一个值进行测试过程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接