UIAccessibilityAnnouncementNotification VoiceOver Interruption

时间:2014-11-10 15:30:41

标签: objective-c accessibility uiaccessibility

我在使用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);
}

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

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

有谁知道更好的方法?

提前致谢:)

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

让VoiceOver完成其主要任务,然后在“ dispatch_after”执行块的帮助下发布通知以宣布所需的指令。

// Delay execution of my block for 2 seconds.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, @"desiredInstructionString"); });