我正在调试一个需要使用VoiceOver完全访问的应用程序,并且一个功能要求用户选择要播放的歌曲 . 该应用程序使用MPMediaPicker . 问题是MPMediaPicker并不真正满足VoiceOver的可访问性要求,例如它没有宣布是否选择了列表的元素,它没有明确宣布用户何时选择元素,搜索时不会公布该号码当列表被删减时,列表中的所选元素被排除,更糟糕的是,当选择按钮添加所有歌曲时它不会发布任何内容(它只是保持静音) .
在我看来,对于如此广泛使用的标准组件,这些都是相当大的疏忽,我想知道如何为我的客户端解决这些问题,因为它在Apple文档中明确指出我不能继承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不会以任何方式宣布该项目 .
1 回答
我认为这很好地总结了一些事情 . 从Apple文档中参考
MPMediaPickerController
:这个控件不完整,可能永远不会完整,因为自iOS 3.0以来它一直被认为是“beta”API .
此外,总结我的发现,不可能使这种控制可访问 . 我能够稍微调整它的视图,每次我能够添加额外的标签时,它很快就被覆盖并重置 . 每次被控件默认行为覆盖时,找到正确的回调来重置标签将是困难的(不可能),显然我们不能覆盖单个元素的
UIAccessibilityProtocol
方法,因为它们不是我们实例化的控件 . 我们已经实例化了全局控制,它正在为我们绘制一切 . 最后,评论者会将其视为访问私有API,因此无论如何都不允许在App Store上使用 .结论:为了提供您希望的可访问性支持,您必须手动实现类似的控件 .