Objective c UIAccessibilityAnounceNotification语音切换中断

Objective c UIAccessibilityAnounceNotification语音切换中断,objective-c,accessibility,uiaccessibility,Objective C,Accessibility,Uiaccessibility,我在iOS 7/8上遇到了很多麻烦。我正在使用的特定用例是我所期望的一个非常常见的进度保存用例 编辑: 我注意到,从我最初的问题来看,预期的结果并不清楚,因此我在这里添加了一个描述:目标是通过画外音(VoiceOver)来讲述已保存的进度消息,以代替正在讲述的导航栏标题,或者在它被讲述之后。我不确定在这种情况下,可访问性的典型行为是什么,因此可能熟悉iOS可访问性的人也可以澄清这一点 从最简单的解决方案开始,朝着最复杂的方向努力,我尝试了以下方法 -(void) showProgressSave

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

编辑: 我注意到,从我最初的问题来看,预期的结果并不清楚,因此我在这里添加了一个描述:目标是通过画外音(VoiceOver)来讲述已保存的进度消息,以代替正在讲述的导航栏标题,或者在它被讲述之后。我不确定在这种情况下,可访问性的典型行为是什么,因此可能熟悉iOS可访问性的人也可以澄清这一点

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

-(void) showProgressSavedPanel {

    ... // present the panel toast
    NSString * message = NSLocalizedString(@"Your progress has been saved.", @"Progress saved message");
    UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, message);
}
不幸的是,使用这种方法,当公告自动说出导航栏标题,然后是后退按钮的标题时,会很快被画外音打断。实际的画外音效果类似于您的进度-导航栏标题-后退按钮

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

-(void) showProgressSavedPanel {

    ... // present the panel toast
    UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, _progressSavedLabel);
}
使用UIAccessibilityScreenChangedNotification或UIAccessibilityLayoutChangedNotification都会产生相同的结果:预期的消息无论如何都不会发出。不管我做什么,画外音似乎只是想说出导航栏的标题

我想出了一个解决方案,使我成为一只非常悲伤的熊猫,那就是在任意延迟1.5后使用除发布公告通知之外的第一个解决方案,导致公告发生在后栏按钮项被说出之后

有人知道更好的方法吗


提前感谢:

您可能无法使用现成的API实现所需的效果。正如您所观察到的,时间安排有点棘手,可能是由于VoiceOver本身正在努力在加载完成后开始阅读屏幕内容


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

让画外音完成它的主要任务,然后在执行后调度块的帮助下发布通知以宣布所需的指令

// 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"); });

你想干什么?当视图出现时选择一个项目,或在收到回调时读取进度?让VoiceOver宣布出现在ViewDidDisplay上的进度保存的toast的内容。在UIAccessibilityConstants.h中,当屏幕的布局发生变化时,例如当单个元素出现或消失(可选参数化元素)时,应发布UIAccessibilityLayoutChangedNotification。但是,只有公告方法才能成功地表达元素的内容。@DavidRönnqvist感谢您的反馈;我更新了上面的问题,以澄清预期结果。看起来越来越像这是答案。我想这突出了我们规范中的另一个问题,即在对话框完全宣布之前约3秒,toast就会消失。我已经开始转向一种方法,在这种方法中,我总是通过适合每个视图控制器的任意延迟来延迟画外音公告。只要这不会让支持可访问性的用户感到惊讶,我认为一切都应该很好这里讨论得很好。标记为目前已接受的答案。也许UIA的可访问性环境和API会随着时间而改变。在我看来,UIAccessibilityLayoutChangedNotification最理想的工作方式是,至少就我在苹果文档中的解释而言。UIAccessibilityLayoutChangedNotification的文档不排除此用例,但是UIAccessibilityAnounceNotification上的注释明确地标识了它:使用此通知提供有关不更新应用程序用户界面UI或仅短暂更新UI的事件的可访问性信息。