我在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);
}不幸的是,使用这种方法,当VoiceOver自动说出导航栏标题,后面是后退按钮的标题时,公告很快就被打断了。实际的VoiceOver结果类似于“您的进度有-- Navbar标题--后退按钮”。
阅读关于iOS可访问性的文章,我发现了一个新的API,它似乎也不起作用。添加了一个直接指向进度保存标签的新IBOutlet后,我将上面的代码替换为以下代码:
-(void) showProgressSavedPanel {
... // present the panel toast
UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, _progressSavedLabel);
}无论是使用UIAccessibilityScreenChangedNotification还是使用UIAccessibilityLayoutChangedNotification,结果都是一样的:预期的信息没有被说出来。无论我做什么,似乎VoiceOver只是想说肚脐标题。
我想出了一个解决方案,这使我成为一个非常悲伤的熊猫,它使用第一个解决方案,除了在任意延迟后发布公告通知(1.5似乎有效),导致在背棒按钮项目被发言后发布公告。
有谁知道更好的方法吗?
(预先谢谢:)
发布于 2014-11-10 18:35:24
您可能无法实现任何一个API开箱即用的预期效果.正如您所观察到的,时间安排有点棘手,可能是由于VoiceOver本身正在努力在加载完成后开始读取屏幕内容。
在我看来,即时可见的通知,如吐司对话框,最好是用公告来描述。您还希望在用户被告知他们在哪个屏幕上之后,发布公告。虽然不太理想,但在人为地、硬编码的延迟之后,考虑发布公告是正确的。一旦实现,试验不同的本地化,以确保它是一致的阅读后,标题。
发布于 2019-11-15 12:13:40
让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"); });https://stackoverflow.com/questions/26847179
复制相似问题