自定义后退按钮的可访问性

Posted

技术标签:

【中文标题】自定义后退按钮的可访问性【英文标题】:Accessibility for custom back buttons 【发布时间】:2016-11-18 12:52:38 【问题描述】:

我使用自定义UIButton 作为视图控制器中的后退按钮。这个后退按钮不在UINavigationBar 中,它被简单地视为浮动在内容顶部的视图,其操作会触发弹出(但可以很容易地调用解除视图控制器的委托方法。

我希望 ios 中的辅助功能将这个后退按钮视为正确的导航后退按钮,而不是标记为“后退”的常规按钮。

在 WWDC '16 上,一位 Apple 无障碍工程师告诉我,这对用户来说可能非常重要(可能是因为某些无障碍设备会使用此信息)。他可以通过 VoiceOver 中的标签发音方式判断出我没有正确实现它(“后退按钮”与“后退按钮”......如果您在标准 @987654323 上使用画外音,您可以自己听到差异@的导航栏“后退”按钮与accessibilityLabel 设置为NSLocalizedString("Back", nil) 的常规UIButton 相比。

不幸的是,我这辈子都不记得如何解决这个问题(或者至少,没有记笔记:/)。

当指向导航栏后退按钮时,Accessibility Inspector 没有给出特殊的不同的可访问性属性(并且反复崩溃)。

那么...我错过了什么?它是一些可访问性元素/容器特征吗?还是按钮的类型?或者它是基于它在导航栏中的一些 UIKit 魔法?

【问题讨论】:

【参考方案1】:

首先,在功能上,两者在功能上没有区别。你措辞的方式表明你担心它的功能,你不应该担心。这里的重要部分是它正确地宣布。可访问性 api 并不关心按钮的功能,因此无论您是调用委托方法还是关闭视图控制器都是完全无关紧要的。

因此,让我们关注元素是如何与用户对话的。在 iOS 中控制元素如何朗读的内容如下。

辅助功能标签:或文本,用于具有固有文本值的按钮。 EX:按钮的标题,或文本字段中的文本。不过,值得注意的是,如果您覆盖可访问性标签,此文本也将被覆盖!

辅助功能提示:描述执行操作后果的附加文本。并不总是需要,但在某些情况下会有所帮助。

可访问性特征:UI 元素可以扮演的一组预定义角色。这些在应用于元素时会产生不同的结果。有些人会更改元素的宣布方式(如按钮和链接),有些人会针对某些行为(如元素是否播放声音)向辅助功能 API 发出警告,以便 VoiceOver 可以做出相应的反应。所以现在!让我们分解一下“后退”按钮的“正确”标记,以及公告元素的来源。

AccessibilityLabel = "Back"
OR
Title/Text = "Back" and AccessibilityLabel = nil
AccessibilityTraits = [Button]
AccessibilityHint = "Goes back to the previous screen."  

**在这种情况下,我将认为提示是可选的。

VoiceOver 公告:

Back (短暂停) #button (长暂停) 返回上一个 屏幕。

其中#button = 按钮的本地化词。在这种情况下,只需按钮。但值得注意的是,通过使用按钮特性,您可以通过编程方式告诉应用您有一个按钮,并允许 VoiceOver 弄清楚如何宣布它!当涉及到本地化、谓词与主语第一语言等时……这非常重要。此外,以编程方式确定角色是 WCag 的一项要求,虽然本机应用程序没有正式要求,但它仍然是最佳实践。请记住,我们不仅关心 VoiceOver 如何响应您的控制,还关心其他潜在的 AT。确保每条信息都存储在正确的位置非常重要。您或许可以欺骗 VoiceOVer 使其行为正常,但您的应用将如何为盲文板呈现?

另一种错误标记是将所有这些信息放在可访问性标签中:

AccessibilityLabel: "Back, button"
Traits: none
Hint: none.

这将宣布非常相似,但略有不同(显然我在这种情况下省略了提示)。熟悉辅助功能 API 的人肯定会注意到,而且肯定有人使用旁白旁的 AT 形式...例如盲文板。

【讨论】:

谢谢。如果我的文字不清楚,我深表歉意,但我的问题不是关于使用特征/标签来指定按钮 - 我理解这一点并且它已正确实施。问题是关于导航控制器中后退按钮与通用 UIButton 的具体情况。他们的语音报告不同,我想知道为什么会这样,以及(正如一位 Apple 工程师告诉我的那样)某些辅助工具(例如盲文板或 Switch)是否存在功能差异。 为了清晰起见,最安全的做法是包含代码示例或要点。 恐怕我看不出什么代码有帮助?正如我在上面所写的,一个通用的 UIButton (let btn = UIButton(); btn.accessibilityLabel = NSLocalizedString("Back", nil)) 会说出“Back. Button”这个短语。 (注意 Back 和 Button 之间的暂停)。导航栏中的后退按钮(实际上是 UIBarButtonItem)(只需将 viewController 推到 UINavigationController 上即可创建)将显示“后退按钮”(无暂停)。不确定要提供哪些其他代码。 代码允许人们使用可访问性检查器并检查此行为的错误/其他意外原因。我编写自己的版本对此无济于事。否则,您将拥有自己得出结论所需的所有信息。

以上是关于自定义后退按钮的可访问性的主要内容,如果未能解决你的问题,请参考以下文章

VoiceOver 忽略 UIBarButton 中的可访问性提示

如何禁用自定义静态 UITableViewCell 的可访问性

UIScrollView 中的可访问性问题

自定义 UITableview 单元格可访问性无法正常工作

自定义 UITableViewCell 可访问性

在 XCUITest 的可访问性指示器中找不到 stackview