objective-c – UIAccessibilityAnnouncementNotification VoiceOver Interruption

我在使用iOS 7/8 UIAccessibility方面遇到了很多麻烦.我正在使用的具体用例是我期望的一个非常常见的“进度保存”用例.

编辑:
我已经注意到,我原来的问题并不清楚所期望的结果,所以我在这里添加了一个描述:目标是通过VoiceOver说出“已保存进度”的消息,代替NavigationBar正在讲话的标题,或在说完之后.在这种情况下,我不确定可访问性的典型行为是什么,因此熟悉iOS Accessibility的人也可以澄清这一点.

从最简单的解决方案开始,并朝着最复杂的方向努力,我尝试了以下方法.

-(void) showProgressSavedPanel {

    ... // present the panel toast
    NSString * message = NSLocalizedString(@"Your progress has been saved.", @"Progress saved message");
    UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, message);
}

不幸的是,通过这种方法,当VoiceOver自动说出导航栏标题后跟后退按钮的标题时,会很快中断声明.实际的VoiceOver结果类似于“您的进度 – 导航栏标题 – 后退按钮”.

阅读有关iOS可访问性的内容,我发现了一个新的API,它似乎也不起作用.添加了一个直接指向进度保存标签的新IBOutlet后,我用以下代码替换了上面的代码:

-(void) showProgressSavedPanel {

    ... // present the panel toast
    UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, _progressSavedLabel);
}

使用UIAccessibilityScreenChangedNotification或UIAccessibilityLayoutChangedNotification具有相同的结果:没有说出预期的消息.无论我做什么,似乎VoiceOver只想说出导航栏标题.

我想出了一个解决方案,让我成为一个非常伤心的熊猫,这是使用第一个解决方案,除了在任意延迟后发布公告通知(1.5似乎工作),导致公告发生在后栏按钮项目有已经说过了.

有谁知道更好的方法?

提前致谢 :)

最佳答案 使用任何一种API开箱即用,您可能无法达到预期的效果.正如您所观察到的,时机有点棘手,可能是因为VoiceOver本身正在努力在加载完成后开始阅读屏幕内容.

在我看来,使用公告最好描述像吐司对话框这样的瞬态可见通知.您还希望在用户被告知他们所在的屏幕后发布通知.虽然不理想,但您可以考虑在人为的,硬编码延迟之后发布公告.实施后,尝试使用不同的本地化,以确保在标题后始终如一地阅读.

点赞