2012-01-14 9 views
1

私は自分のiPhoneゲームにアクセシビリティを追加し、UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification、@ "string")を大量に使用して、それは99%の時間でうまく動作しますが、私は1つの問題を抱えています。VoiceoverはUIAccessibilityPostNotificationを使用して大きな休止を持っています

ボイスオーバーアナウンスはすべて、アプリケーションデリゲートに追加した1つの方法から実行されます。

 
- (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]; 
      } 
     } 
    } 
} 

遅延があるため、次のイベントがゲームで発生する前にアナウンスが話されます。アニメーションやその他のイベントが終了する前に発表全体が確実に行われるようにするには、より良い方法を見つけることができませんでした。

このメソッドを呼び出すとすぐにアナウンスが1つだけ発音されます。ある場合には、発言が行われる前に約10秒の休止がある。この場合、コードをデバッグしてブレークポイントを設定し、UIAccessibilityPostNotification行を手動で実行しても行は実行されますが、何も起こりません。 10秒後、デバッガで何もせずに、iPhoneはただアナウンスを話し始める。

この1つの発表で特別なのは、UIScrollViewのtouchesEnded:イベントから呼び出されるということだけです。他のアナウンスはゲーム全体のループの一部であり、タッチイベントに基づいていません。

ボイスオーバーがアクセシビリティ通知をキューに入れてすぐに話すことができない原因は何ですか?事前に

おかげで、 スティーブ

+0

回答を受け入れることはできますか? – Brenden

答えて

3

iOS 6のみをサポートして転送できる場合は、UIAccessibilityAnnouncementDidFinishNotificationを使用してアナウンスが完了したことを確認してから続行してください。すべてのテキストが読み込まれた場合や発表が中止された場合

あなたは、他の通知

// 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. 
    } 
} 
+0

あなたは私を助けることができます[これ](http://stackoverflow.com/questions/12395588/gestures-not-getting-detected-in-accessibility-mode)質問?私は 'UIAccessibilityPostNotification'を使って通知を投稿する方法をまだ見つけていません。私は 'voiceOver'が実際にこのコマンドを使って実行されていることを確認しました:' UIAccessibilityIsVoiceOverRunning() ' –

+0

それは不思議に動作し始めました。 –

+0

この通知は、標準的なUIアナウンスではなく、プログラムによってトリガされたアナウンスに対してのみ発生します。偽のアナウンス 'UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification、@" x ");で' UIAccessibilityAnnouncementDidFinishNotification'をトリガーして解決策をハッキングしました。 – Brenden

0

は、私のコメントを読んでください。これは、NSThread sleepForTimeIntervalを使用した自発的な問題です。私はこれが悪い形で何度も読んだことがありますが、アクセシビリティボイスオーバーのアナウンスのためのより良い解決策はまだありません。私はアップルがこのUIAccessibilityPostNotificationコールのブロック(またはObjective-Cメソッドも使用)を作成するか、ボイスオーバーが完了したときのコールバックを見たいと思っています。

2

遅延を渡してスリープしているのではなく、このメソッドを呼び出してアナウンスを話すときは、次のイベントをトリガーするために遅れてブロックをディスパッチしてdispatch_afterを使用して実行することができます。ブロックを渡してこのメ​​ソッドに遅れてもらいたい場合は、このメソッド内からディスパッチを送信してください。

関連する問題