Ios Voiceover使用UIAccessibilityPostNotification具有巨大的暂停

Ios Voiceover使用UIAccessibilityPostNotification具有巨大的暂停,ios,iphone,accessibility,voiceover,uiaccessibility-notification,Ios,Iphone,Accessibility,Voiceover,Uiaccessibility Notification,我正在为我的iPhone游戏添加可访问性,并广泛使用UIAccessibilityPostNotification(UIAccessibilityNounationNotification,@“字符串”)来宣布游戏中发生的各种事情。它在99%的时间内运行良好,但我有一个问题 在所有情况下,voiceover公告都是从我添加到应用程序委托的单个方法执行的 - (void)voiceoverAction:(NSString *)speakString delay:(NSTimeInterval) d

我正在为我的iPhone游戏添加可访问性,并广泛使用UIAccessibilityPostNotification(UIAccessibilityNounationNotification,@“字符串”)来宣布游戏中发生的各种事情。它在99%的时间内运行良好,但我有一个问题

在所有情况下,voiceover公告都是从我添加到应用程序委托的单个方法执行的

- (void)voiceoverAction:(NSString *)speakString delay:(NSTimeInterval) delay { if (![[[[UIDevice currentDevice] systemVersion] substringToIndex:1] isEqualToString:@"3"]) { if (UIAccessibilityIsVoiceOverRunning()) { UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, speakString); if (delay > 0) { [NSThread sleepForTimeInterval:delay]; } } } } -(void)voiceoverAction:(NSString*)speakString延迟:(NSTimeInterval)延迟{ 如果(![[[UIDevice currentDevice]systemVersion]子字符串到索引:1]IsequalString:@“3”]){ if(uiAccessibilityVoiceOverling()){ UIAccessibilityPostNotification(UIAccessibilityAnounceNotification,speakString); 如果(延迟>0){ [NSThread sleepForTimeInterval:延迟]; } } } } 延迟是存在的,因此在游戏中的下一个事件发生之前宣布。我找不到更好的方法来确保在某个动画或其他事件中断之前,整个公告都已发布

在任何情况下,除了一种情况外,调用此方法时都会立即发出通知。在一种情况下,在说话前大约有10秒的停顿。在这种情况下,即使我调试代码并设置断点并手动执行UIAccessibilityPostNotification行,该行也会执行,但不会发生任何事情。10秒钟后,在调试器中什么都不做的情况下,iPhone开始发布公告

这一声明唯一的特别之处在于它是从UIScrollView的touchesEnded:event调用的。其他公告是整个游戏循环的一部分,不基于触摸事件

你知道什么会导致voiceover将可访问性通知排队而不立即说出吗

提前感谢,,
史蒂夫读了我的评论。这是使用NSThread sleepForTimeInterval自行造成的问题。我已经读过很多次了,这是一个糟糕的形式,确实如此,但我仍然没有看到一个更好的解决方案,用于无障碍画外音公告。我希望苹果为这个UIAccessibilityPostNotification调用创建一个块(因此也使用Objective-C方法),或者在画外音结束时创建一个回调。

而不是传递延迟并进行睡眠,无论何时调用此方法来发布公告,您都可以同时使用
dispatch\u after
在延迟后调度一个块来执行,以触发下一个事件。如果愿意,您还可以将块和延迟传递给此方法,并在此方法中发送分派。

如果您只能支持iOS 6和转发,则可以使用
uiAccessibilityAnounceDidFinishNotification
确保在继续之前完成公告

你会像其他通知一样遵守它

// Observe announcementDidFinish to know when an announcment finishes
// and if it succuded or not. 
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(announcementFinished:)
                                             name:UIAccessibilityAnnouncementDidFinishNotification
                                           object:nil];
您返回的通知包含公告的文本,以及所有文本是否已阅读或公告是否已中止。如果您有多个通知,则可以等待正确的通知

// When an announcement finishes this will get called.
- (void)announcementFinished:(NSNotification *)notification {
    // Get the text and if it succeded (read the entire thing) or not
    NSString *announcment = notification.userInfo[UIAccessibilityAnnouncementKeyStringValue];
    BOOL wasSuccessful = [notification.userInfo[UIAccessibilityAnnouncementKeyWasSuccessful] boolValue];

    if (wasSuccessful) {
        // The entire announcement was read, you can continue.
    } else {
        // The announcement was aborted by something else being read ...
        // Decide what you want to do in this case. 
    } 
}

你能帮我提个问题吗?我还没有找到如何使用
UIAccessibilityPostNotification
发布通知。我使用以下命令检查了
voiceOver
是否确实正在运行:
uiaccessibilityvoiceoverwing()
此通知仅对通过编程触发的公告触发,而不是标准的UI公告。我通过使用虚假公告触发
uiaccessibilitynounoncendfinishnotification
UIAccessibilityPostNotification(uiaccessibilitynouncendfinishnotification,@“x”)入侵了一个解决方案。你能接受答案吗?