Skip to content

voiceover

Daisuke Sato edited this page Oct 5, 2021 · 1 revision

VoiceOver対応

  • NavDeviceTTS: 音声読み上げ

    • VoiceOverが立ち上がっていない時はTTSを自前で作って、それに読ませる
    • VoiceOverが立ち上がっている場合は、VoiceOverに読ませる
      • 場合によりTTSにも読ませて2つの音声で同時に案内するということも可能
    • テキスト読み上げのリクエストに対して、すぐにTTSに入れると読み飛ばされたり、間にポーズをいれたりすることができないので、自前のqueueに入れて一つずつTTSに食わせる
      • 自前のTTSとVoiceOverで読み上げ完了の通知の受け方が違う
      • VoiceOverの読み上げは途中で操作が入るなど、中断されて終了通知が来ないことがあるので、最大長を適当に計算してそれ以上待っても通知がこない場合は強制的に終了したことにする(だんまりを防ぐ)
        • 最大長は各言語いくつか分を喋らせて、その長さからざっくり推定
      • 英語の場合は"."、日本語の場合は"。"が3つ以上連続した場合は、個数*0.1秒分間をあける。
        • TTS_PAUSE_CHARのi18nのテキストとして登録
  • NavCoverView: ナビゲーション中の画面操作

    • VoiceOverが動いていると通常Tapを検出するには画面のジェスチャとして認識する必要があるが、それをするとVoiceOverの機能が働かなくなるので、VoiceOverの通常操作とTapの検出を両立するHackが入っている
      • 前提
        • VoiceOverは未フォーカスの要素にフォーカスすると通知を出す
        • UIAccessibilityLayoutChangedNotificationで、フォーカスされている要素が変わっていない場合は何も読まない
      • Hack
        • 画面要素を2つ用意する
          • UIAccessibilityElementなら良いので、画面に表示されていなくても良い
        • 一つを大きくする(Tapを検出したい範囲のサイズ)
        • もう一つは小さくしておく(width,heightは1,1以上)
        • 大きい要素がタップされたら、タップされた要素を小さくし、小さい要素を大きくし、UIAccessibilityLayoutChangedNotificationで画面の変更をVoiceOverに通知する。
Clone this wiki locally