我的应用程序中有一个有点自定义的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行为?谢谢你的帮助!
答案 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
。这样你就不会降低正常体验。