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

时间:2016-05-05 02:22:18

标签: ios accessibility uipickerview

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:0)

一种解决方法是检查语音播放是否正在运行

UIAccessibilityIsVoiceOverRunning()

如果是,请使用titleForRow,否则请使用viewForRow。这样你就不会降低正常体验。