我的应用中有一个稍微定制的 UIPickerView。基本上我使用 pickerView:viewForRow:forComponent:reusingView
返回一个简单的 UILabel。当我开始着手让应用程序更易于访问时,我注意到 VoiceOver 会读取标签并添加,例如“3 of 300”(即总行数“的”行)。这不是我们想要的行为。
在尝试解决此问题时,我发现如果我使用 pickerView:titleForRow:forComponent
而不是 pickerView:viewForRow:forComponent:reusingView
,而没有任何其他更改,那么我只需阅读所选行的“标题”即可获得 VoiceOver 的所需行为。我在 iOS 9 上对此进行了测试。
问题是:如何让 UIPickerView 恢复到“正常”的 VoiceOver 行为,同时仍然使用 pickerView:viewForRow:forComponent:reusingView
?感谢您的帮助!
我向 Apple 支持寻求帮助。官方回复是:“我们的工程师已经审查了您的请求,并得出结论认为,鉴于目前的发货系统配置,没有支持的方式来实现所需的功能”。 (为了后代 - 这是最新的 iOS 版本是 9.4 的时候)。他们建议提出新功能的请求,我可以这样做。
为了解决这个问题,我采用了以下解决方法。
pickerView:titleForRow:forComponent
而不是 pickerView:viewForRow:forComponent:reusingView
。本类(class)介绍 Vanilla 非自定义选择器。pickerView:viewForRow:forComponent:reusingView
。本类(class)展示了一个完全自定义的选择器。UIAccessibilityIsVoiceOverRunning()
在 VoiceOver 开启时创建基类对象,否则创建子类对象因此,当用户运行 VoiceOver 时,他们会得到一个外观丑陋的选择器,但在可访问性方面表现得非常好(即没有行号公告)。我认为这是一个完全合理的“妥协”,因为基本上可以保证用户不会关心视觉外观。
关于iOS - 自定义 UIPickerView 上的意外 VoiceOver 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37041272/
欢迎光临 OGeek|极客世界-中国程序员成长平台 (https://ogeek.cn/) | Powered by Discuz! X3.4 |