2016-05-31 17 views
3

私のアクセシビリティサポート/ Voice Overを私のアプリケーションに追加しようとしています。メイン画面には3つのメインコントロールがありますが、3つ目のコントロールは埋め込みビューコントローラ内でホストされています。設定view.accessibilityElements with埋め込みビューコントローラ

私はprepareForSegueにおけるアクセシビリティの要素を設定していますし、埋め込まれたビューコントローラのコントロールがすべてロードされていることを確認しました。問題は、私はまだ、囲みビューコントローラ内にある最初の2つのコントロールのみを選択することができます。

self.view.accessibilityElements = 
    @[ 
     self.cmdMenu,      // works 
     self.collectionView,    // works 
     self.childViewController.peerMenu // doesn't work 
    ]; 

3つのビューにisAccessibilityElement = YESがあります。

何か不足していますか?同じView Controller内のアクセシビリティ要素に制限があるとは想像もできません。

+0

見解は何ですか?他の違いはありますか?配列からコレクションビューを削除すると、別の結果が表示されますか? – Wain

+0

どちらのメニュービューも、私が作成したコントロールのインスタンスです。accessibilityElementsからcollectionViewを削除すると、cmdMenuだけにアクセスできます。 –

答えて

3

私のバグが見つかりました。現在、Voice Overが動作しています。このプロセスで、私は共有したいことのいくつかを考え出しました。

  1. 元の質問には、メインビューコントローラから子ビューコントローラのコントロールを参照できます。コントロールを直接追加することができます(自分の質問と同じように)。または、self.view.accessibilityElements = @[ _control1, childViewController.view, childViewController2.view]を使用して、すべてのアクセシビリティ要素を子ビューコントローラに追加できます。
  2. 子ビューコントローラのすべてのコントロールを(1)のように追加する場合は、childViewController.view.isAccessibilityElement = NOを必ず使用してください。
  3. アクセシビリティ情報を持たない要素でも、accessibilityElementsに任意の種類のオブジェクトを追加できます。 APIはあなたにアサートまたは警告しません。これは私のバグだった。
  4. あなたのUIが変更された場合、あなたはそれがUIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, self)の使用についてのUIKitを伝えるあなたのaccessibilityElements配列内のアイテムの数や順序を変更する必要があります。通知引数(ここでは、私がselfを送信している)は、通知が完了したときにカーソルをどこに配置すべきかをVoice Overに伝えます。
  5. あなたが声を出して、過渡通知のためのいくつかのテキストを読みたい場合は(クラッシュ・オブ・クランがあなたに伝えたときに想像し、あなたがその木の切り株で見つかったどのように多くの宝石)UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, messageText)を呼び出します。 1つの注意点、他のVoice Overが進行中でない限り、これはmessageTextを大声で読み上げません。自分でタイミングを管理する必要があります。これに関するバグを提出しました。 Appleはこれをもっと良くすることができます。
  6. あなたがUIAccessibilityAnnouncementDidFinishNotificationのために聞くことができUIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, messageText)を使用しているが、残念ながらこの通知は、ほとんど価値を持っている場合。あなたはあなたのmessageTextが完全に話された場合にのみ通知を受けるでしょう。それは話されたが、中断されたとは言わず、UIKitフレームワークを通して話されたテキストについてもトリガーされません。
  7. iOSシミュレーターのアクセシビリティインスペクタは嫌です。あなたのアクセシビリティの設定が正しい場合は、そこに何があるかを教えてくれるでしょう。問題がある場合、Inspectorは何が間違っているかに関する情報をあなたに提供しません。これは、UIAccessibility API全体に当てはまります。それはほとんどいつも働くように使いやすいです。しかし、それが動作しない場合は、それを理解するために狩りとペックに頼る必要があります。 APIには、Appleが制約の警告を処理する方法と同様のアサーションやコンソールメッセージが必要です。 Spoiler警告:Xcode 8のアクセシビリティインスペクタはうまくいっていますが、それでも私の問題には役に立たなかったでしょう。
  8. UIAccessibility.hヘッダーには数多くの優れた情報があります。あなたがUIAccessibilityサポートに着手しているなら、それは良い読書です。
+0

優れた書き込み!アクセシビリティの階層がすぐに失効するため、これは、特にUIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification、self)を使用しないで、XCUITestsに数多くの問題を引き起こしていました。 –

関連する問題