首页 文章

MPMediaPickerController无法通过VoiceOver声明控件

提问于
浏览
1

我正在调试一个需要使用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 回答

  • 0

    我认为这很好地总结了一些事情 . 从Apple文档中参考 MPMediaPickerController

    这是开发中的API或技术的初步文档 . Apple正在提供此信息,以帮助您规划采用此处所述的技术和编程接口,以便在Apple品牌产品上使用 . 此信息可能会发生变化,根据本文档实施的软件应使用最终操作系统软件和最终文档进行测试 . 本文档的较新版本可能会提供API或技术的未来版本 .

    这个控件不完整,可能永远不会完整,因为自iOS 3.0以来它一直被认为是“beta”API .

    此外,总结我的发现,不可能使这种控制可访问 . 我能够稍微调整它的视图,每次我能够添加额外的标签时,它很快就被覆盖并重置 . 每次被控件默认行为覆盖时,找到正确的回调来重置标签将是困难的(不可能),显然我们不能覆盖单个元素的 UIAccessibilityProtocol 方法,因为它们不是我们实例化的控件 . 我们已经实例化了全局控制,它正在为我们绘制一切 . 最后,评论者会将其视为访问私有API,因此无论如何都不允许在App Store上使用 .

    结论:为了提供您希望的可访问性支持,您必须手动实现类似的控件 .

相关问题