我正在使用VoiceOver调试需要完全辅助功能的应用,并且一个功能要求用户选择要播放的歌曲。该应用程序使用MPMediaPicker。问题是MPMediaPicker并不真正满足VoiceOver的可访问性要求,例如它没有宣布是否选择了列表的元素,它没有明确宣布用户何时选择元素,搜索时不会公布该号码当列表被删减时,列表中的所选元素将被删除,更糟糕的是,当选择按钮添加所有歌曲时,它不会发布任何内容(它只是保持沉默)。
在我看来,对于如此广泛使用的标准组件来说,这些是非常大的疏忽,我想知道如何为我的客户解决这些问题,因为它在Apple文档中明确说明我可以&#39 ; t子类MPMediaPickerController也不操纵其私有视图层次结构。 值得关注的是,我的应用程序也使用标准组件来选择似乎也有类似问题的联系人。
谢谢。
编辑: 该应用程序使用此代码呈现MPMediaPickerViewController,我相信它是相当标准的(可能有点过时,因为它仍然使用保留/释放)
MPMediaPickerController *picker = [[MPMediaPickerController alloc] initWithMediaTypes: MPMediaTypeAnyAudio];
[picker setDelegate: self];
[picker setAllowsPickingMultipleItems: YES];
picker.prompt = NSLocalizedString (@"...", "...");
[[myAppDelegate instance] presentModalViewController: picker animated: YES];
[picker release];
其中presentModalViewController是这样的:
- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated {
UIViewController *c = self.window.rootViewController;
while ([c presentedViewController]) {
c = [c presentedViewController];
}
[c presentModalViewController:modalViewController animated:animated];
}
语音中缺少的通知属于作为选择过程的一部分显示的组件以及MPMediaPickerController的层次结构,因此我不知道如何访问它们。 上面的代码在属于NavigationController的ViewController的简单(+)右侧栏按钮的IBAction中调用。
进一步说明: 最小的概念验证:在Xcode中创建默认的单页iOS应用程序。添加@import MediaPlayer;然后将此代码添加到ViewController。
- (void)viewDidAppear:(BOOL)animated {
MPMediaPickerController *picker = [[MPMediaPickerController alloc] initWithMediaTypes: MPMediaTypeAnyAudio];
[picker setDelegate: self];
[picker setAllowsPickingMultipleItems: YES];
picker.prompt = NSLocalizedString (@"...", "...");
[self presentViewController:picker animated:true completion:^{
}];
}
启动VoiceOver启动应用程序,然后选择或导航到单元格"添加所有歌曲":VoiceOver不会以任何方式宣布该项目。
答案 0 :(得分:0)
我认为这很好地总结了一些事情。从Apple文档中参考MPMediaPickerController
:
这是开发中的API或技术的初步文档。 Apple正在提供此信息,以帮助您计划采用此处所述的技术和编程接口,以用于Apple品牌产品。此信息可能会发生变化,根据本文档实施的软件应使用最终操作系统软件和最终文档进行测试。本文档的较新版本可能会提供API或技术的未来版本。
此控件不完整,可能永远不会完整,因为自iOS 3.0以来它一直被视为“beta”API。
另外,总结一下我的发现,不可能使这个控件可访问。我能够稍微调整一下它的视图,每次我能够添加额外的标签时,它很快就会被覆盖并重置。每次被控件默认行为覆盖时,找到正确的回调来重置标签将是困难的(不可能),显然我们不能覆盖单个元素的UIAccessibilityProtocol
方法,因为它们不是我们实例化的控件。我们已经实例化了全局控制,它正在为我们绘制一切。最后,评论者会将其视为访问私有API,因此无论如何都不允许在App Store上使用。
结论:为了提供您希望的辅助功能支持,您必须手动实现类似的控制。