如何为 UIPickerView 行设置 Voice Over 辅助功能标签?

Posted

技术标签:

【中文标题】如何为 UIPickerView 行设置 Voice Over 辅助功能标签?【英文标题】:How to set the Voice Over accessibility label for UIPickerView rows? 【发布时间】:2015-06-11 20:38:22 【问题描述】:

我正在尝试使我的 Voice Over 的 UIPickerView 可访问,我注意到 UIPickerViewAccessibilityDelegate 协议相当不完整。它只允许您为 pickerView 组件指定标签和提示,而不是组件中的行。 (它还有一个错误,即它的 pickerView:accessibilityLabelForComponent: 方法没有在它的 pickerView 参数中传递 UIPickerView*,而是一个 UIAccessibilityPickerComponent!)

所以我现在想知道,有没有办法为我的选择器的行设置自定义可访问性标签,还是只能读出屏幕上显示的实际选择器行值?

我正在尝试制作一个显示时间、小时、分钟、秒的选择器视图。我无法让 datePicker 执行此操作。但是,如果每一行都可以在旁白中说出类似“3 小时”而不是仅仅 3 个小时,那就太好了。如果我必须将可见标签设置为我希望旁白读出的内容,那么我不确定标签将适合显示这一点,即。

15 小时 35 分 20 秒

用英文显示在屏幕上的内容相当多,不确定本地化后它会增长多大..因此能够为每一行设置标签是理想的。

干杯

【问题讨论】:

【参考方案1】:

如果您正在实现UIPickerViewDelegatepickerView:viewForRow:forComponent:reusingView: 方法作为填充UIPickerView 组件的方式,您可以通过在您从该方法返回的UIView 上设置accessibilityLabel 来实现每一行的自定义可访问性标签.

请注意,在我使用 pickerView:titleForRow:forComponent: 填充 UIPickerView 的情况下,我未能成功让 VoiceOver 读取自定义辅助功能标签 - 甚至在返回的 NSString 上设置 accessibilityLabel(这在其他一些情况下确实有效,例如为 UITableView 索引设置可访问性标签)并没有改变 VoiceOver 的发音。因此,如果您想自定义 VoiceOver(或 Switch Control)对 UIPickerView 行所说的内容,似乎唯一的方法是使用 pickerView:viewForRow:forComponent:reusingView:,而不是其他 2 种候选方法中的任何一种来填充 UIPickerView 行。

但是,我仍然建议您重新考虑您正在做的事情是否可取。当 VoiceOver(或 Switch Control)用户到达组件时,例如使用accessibilityLabel“Minutes”,他们知道他们在几分钟内,因为 VoiceOver 读取例如“分钟,19”,所以在调整数值时,不需要再听到“20分钟”,“21分钟”; “20”和“21”就足够了,用户可以记住上下文(例如“现在我在几分钟,所以让我们将其调整为 45”)。

【讨论】:

感谢您的信息。我想我现在卡住了,因为我无法指定组件的可访问性标签,因为我描述了 pickerView:accessibilityLabelForComponent: 方法在它的 pickerView 参数中没有传递 UIPickerView*,它是一个 UIAccessibilityPickerComponent 而不是私有 API并且有一个选择器属性是正确的选择器。问题是我在这个 ViewController 中有多个选择器,所以我需要能够识别我正在为其设置组件可访问性标签的选择器。我已经记录了一个关于它的雷达错误。 您对额外的重复提出了一个很好的观点,尽管谢谢。如果我可以修复组件标签,那么也许我可以删除它。现在我刚刚将完整的可见标签设置为我想要的。 我想重复一遍,您可以从 pickerView:viewForRow:forComponent:reusingView: 返回 UIView(例如 UILabel),其 text 将是例如“20”,其accessibilityLabel 将是“20 分钟”。无需将UILabel 的文本也设为“20 分钟”(或从pickerView:titleForRow:forComponent: 返回“20 分钟”)。抱歉,如果我误解了您的评论,但事实并非如此。 再次感谢。我将看看切换到这种方法。我现在正在与同一个视图控制器上的另一个可访问性元素搏斗:( 干杯 当我们扫过行时,您是否看到 PickerView 索引不正确的问题?无论我滑动到哪一行,我总是得到“#totalNumber 中的 1 个”。

以上是关于如何为 UIPickerView 行设置 Voice Over 辅助功能标签?的主要内容,如果未能解决你的问题,请参考以下文章

设置 UIPickerView 行的背景颜色

如何为 UIPickerView 添加边框?

NSTableRowView/NSTableCellView 如何为选定的行设置自定义颜色?

如何为 SwiftUI 列表中的各个行设置动画?

在FastReport中如何为特定的数据行设置显示格式?

如何为表格中的一行设置样式?