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)
使用UIAccessibilityScreenChangedNotification或UIAccessibilityLayoutChangedNotification有相同的结果:预期的信息没有被说出。无论我做什么,VoiceOver 似乎只想说出导航栏标题。
我想出了一个解决方案,让我很伤心大熊猫,这是一个任意延迟(1.5似乎工作)后使用的第一个解决方案,除了张贴公告通知,导致公告出现后回栏按钮项具有被说。
有谁知道更好的方法?
提前致谢 :)
您可能无法使用任一开箱即用的 API 来达到所需的效果。正如您所观察到的,时机有点棘手,可能是由于 VoiceOver 本身在加载完成后开始阅读屏幕内容。
在我看来,像 toast 对话框这样的短暂可见通知最好使用公告来描述。您还希望在用户被告知他们所在的屏幕后发出语音通知。虽然不理想,但您考虑在人为的硬编码延迟后发布公告是正确的。实施后,尝试不同的本地化,以确保在标题之后一致地阅读。