UIAccessibilityAnnouncementNotification VoiceOver 中断

dav*_*ave 5 accessibility objective-c uiaccessibility

我在 iOS 7/8 UIAccessibility 上遇到了很多麻烦。我正在使用的特定用例是我期望的一个非常常见的“保存进度”用例。

编辑: 我注意到我最初的问题并不清楚想要的结果,所以我在这里添加了一个描述:目标是通过 VoiceOver 说出“保存进度”的消息,或者代替正在朗读或朗读之后的 NavigationBar 标题。我不确定在这种情况下可访问性的典型行为是什么,所以也许熟悉 iOS 可访问性的人也可以澄清这一点。

从最简单的解决方案开始,到最复杂的解决方案,我尝试了以下方法。

-(void) showProgressSavedPanel {

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

不幸的是,使用这种方法,当 VoiceOver 自动朗读导航栏标题和后退按钮的标题时,通知很快就会被打断。实际的 VoiceOver 结果类似于“您的进度 - 导航栏标题 - 后退按钮”。

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

-(void) showProgressSavedPanel {

    ... // present the panel toast
    UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, _progressSavedLabel);
}
Run Code Online (Sandbox Code Playgroud)

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

我想出了一个解决方案,让我很伤心大熊猫,这是一个任意延迟(1.5似乎工作)后使用的第一个解决方案,除了张贴公告通知,导致公告出现回栏按钮项具有被说。

有谁知道更好的方法?

提前致谢 :)

Jus*_*tin 5

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

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