iOS - 自定义 UIPickerView 上的意外 VoiceOver 行为

Ale*_*x M 4 accessibility uipickerview ios

我的应用程序中有一个有点自定义的 UIPickerView。基本上我使用pickerView:viewForRow:forComponent:reusingView返回一个简单的 UILabel。当我开始使应用程序更易于访问时,我注意到 VoiceOver 会读取标签并添加,例如“3 of 300”(即行数“of”总行数)。这不是理想的行为。

在尝试解决此问题时,我发现如果我使用pickerView:titleForRow:forComponent而不是pickerView:viewForRow:forComponent:reusingView,而不进行任何其他更改,那么我只需阅读所选行的“标题”即可获得所需的 VoiceOver 行为。我在 iOS 9 上对此进行了测试。

问题是:如何让 UIPickerView 恢复到“正常”的 VoiceOver 行为,同时仍在使用pickerView:viewForRow:forComponent:reusingView?谢谢你的帮助!

Ale*_*x M 5

我向 Apple 支持人员寻求帮助。官方回复是:“我们的工程师已经审查了您的请求,并得出结论,鉴于当前交付的系统配置,没有支持的方法来实现所需的功能”。(对于后代 - 这是最新的 iOS 版本是 9.4 的时候)。他们建议提出新功能的请求,我可能会这样做。

为了解决这个问题,我采用了以下解决方法。

  • 创建了一个与我拥有的类几乎相同的基类,但仅实现pickerView:titleForRow:forComponent而不是pickerView:viewForRow:forComponent:reusingView. 本课程介绍了香草非定制选择器。
  • 创建该基类的子类,现在实现pickerView:viewForRow:forComponent:reusingView. 这个类展示了一个完全定制的选择器。
  • 在我其他地方的代码中UIAccessibilityIsVoiceOverRunning(),当 VoiceOver 打开时,用于创建基类的对象,否则创建子类的对象

因此,当用户运行 VoiceOver 时,他们会得到一个视觉上丑陋的选择器,但它在可访问性方面表现得非常好(即没有行号公告)。我认为这是一个完全合理的“妥协”,因为用户基本上可以保证不关心视觉外观。