web-dev-qa-db-ja.com

UIAccessibilityLayoutChangedNotificationとUIAccessibilityScreenChangedNotificationの実際の違いは?

UIAccessibilityLayoutChangedNotificationUIAccessibilityScreenChangedNotificationを投稿するときに、何が違うのかを正確に確認しようとしています。私が見ることができるものから、それらはどこでも同じように使用でき、何も変わらない。

Appleのドキュメントでは、(たとえば)要素が非表示または表示されている場合はLayoutChangedを使用し、画面全体が変更された場合はScreenChangedを使用すると説明しています。しかし、私はこの情報を提供するときに彼らが何をするのか、どちらか一方を使用するときに違って見えるはずのものに興味があります。

誰もが2つの間の実装の違いを明確に説明できますか?

40
Luke

これらの2つの通知は、ビューの動的コンテンツ用であり、スクリーンリーダーユーザー向けにこれらの変更をVoiceOverに通知します。これらの2つの通知には、デフォルトの動作とScreenChange通知の愚かな小さな「ブープビープ音」を除いて、ほとんど違いがありません。

どちらの場合も、引数

UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, arg);

VoiceOverがフォーカスを移動する、読み取られる文字列または画面上の要素を表します。コンテキストが劇的に変化した場合は、意味のある場所にフォーカスを移動するか、そのような変化があったことを知らせることが重要です。どちらのアプローチもアクセシビリティの観点からは許容できますが、可能な限り最小限の変更を含むアプローチを好みます。単純なレイアウト変更の場合は、ほとんどの場合、コンテキストの変更をアナウンスし、フォーカスを元の場所に置いておくのが最善です。場合によっては、コンテキストの変更を引き起こした要素が非表示になり、新しいコンテンツを強調するためにナレーションを指示する必要があることは明らかです。この場合のデフォルトの動作は定義されていないか、おそらく確定的ですが、まったく何も知らないフレームワークによって決定されます。アプリについて!

2つのイベントの違いは、両方がまったく同じことをしている場合、デフォルトの動作にあります。 UIAccessibilityLayoutChangedNotificationにnilを指定すると、何もしなかったかのようになります。すべてのビュー階層の変更と描画が完了すると、UIAccessibilityScreenChangedNotificationにnil引数を指定すると、accessibilityElementとしてマークされているビュー階層の最初のUIObjectにフォーカスが送信されます。

UIAccessibilityLayoutChangedNotification

UIAccessibilityLayoutChangedNotificationの適切な使用例は、動的フォームです。フォームで行った決定に基づいて、新しいオプションが利用可能であることをユーザーに知らせたいとします。たとえば、フォームでベテランであることを選択した場合、フォームの追加の領域がポップアップしてより多くの入力を提供できますが、これらの領域は、気にしていない他のユーザーには非表示になっている可能性があります。したがって、ユーザー操作後にこれらの要素にフォーカスを移すことができます。

UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, firstNewFormElement);

これにより、提供された要素にフォーカスが移動し、それがaccessibilityLabelであることを通知します。

または、新しいフォーム要素があることを伝えます。

UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, @"Veterans form elements available");

それでもフォーカスはそのままになりますが、VoiceOverは「退役軍人のフォーム要素が利用可能です」と発表します。

注:この特定の動作は、私のiPad(8.1.2)でバグがあります。

または最後にこれを行うことができます:

UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, nil);

これは絶対に何もしません:)真剣に、私はa11yフレームワークのバックエンドが気にすることすら考えていません。この特定のコード行は完全に無駄です。

UIAccessibilityScreenChangedNotification

UIAccessibilityScreenChangedNotificationの良い使用例は、カスタマイズされたタブブラウジング状況です。ナビゲーション領域を除いて、画面全体が変化したとき。基本的に画面全体が変更されたことをナレーションに知らせたいが、最初の要素(最初のタブ)に焦点を合わせるのではなく、最初のコンテンツ要素に焦点を合わせたい。

UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, firstNonGlobalNavElement);

これにより、「ブープビープ」音が鳴り、フォーカスがグローバルナビゲーションバーの真下に移動します。またはこれを行うことができます:

UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, @"You're on a new tab");

これは、新しいタブが読み込まれるのを待ち、「ビープ音」の音を鳴らし、ナレーションで「新しいタブにいます」とアナウンスしてから、画面の最初の要素にフォーカスを移動し、その要素のaccessibilityLabelをアナウンスします。 (PHEW!たくさんあります!これはスクリーンリーダーのユーザーにとって不快です。どうしても必要な場合を除いて、このシナリオは避けてください)。

そして最後に、もちろんこれを行うことができます:

UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil);    

これは次と同等です:

UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, firstA11yElement);

どちらも「ビープ音」の音を鳴らし、VoiceOverフォーカスを画面の最初の要素に移動してからアナウンスします。

最後に

コメントで誰かがキャッシングについて言及しました、そして私は時々私の回答でA11yバックエンドが気にするかもしれないし気にしないかもしれないことについてコメントします。バックエンドのマジックが発生している可能性は確かにありますが、私はこれらの状況のどちらも信じていませんが、バックエンドはまったく気にかけていません。私がこれを言う理由は、

UIAccessibilityContainerプロトコルを使用したことがある場合は、ビューのコンテナーが照会されるときに監視できます。キャッシングは行われていません。 accessibilityElementCountプロパティでさえ、VoiceOverがコンテナー内の新しいAccessibilityElementにフォーカスを変更するたびにpingされます。次に、それがオンになっている要素を確認し、次の要素を要求するプロセスなどを行います。それは動的な状況を処理するためにそのコアで設計されています。インタラクション後にコンテナに新しい要素を挿入する場合でも、これらのクエリはすべて実行され、問題はありません。さらに、UIAccessibilityプロトコルのプロパティをオーバーライドすると、動的なヒントとラベルを提供するために、これらの関数が毎回呼び出されることがわかります。そのため、A11yフレームワークのバックエンドは、これらの通知から絶対にゼロの情報を収集すると思います。 VoiceOverがその仕事をするために必要な唯一の情報は、現在フォーカスされているAccessibility Elementとこの要素Accessibility Containerです。通知は、VoiceOverユーザーがアプリをより使いやすくするためのものです。

Safariがこれらの通知を投稿する回数がこれに当てはまらない場合を想像してください!!!! :)

これらの特定のステートメントは、フレームワークに関するバックエンドの知識があり、コードを操作する人によってのみ確認でき、推測として見なされるべきです。これは、バージョン/実装に大きく依存している場合があります。これらの点についての議論は間違いなく開かれています!この投稿の残りの部分はかなり具体的です。

参考のために

これのほとんどはフレームワークでの作業の経験から来ていますが、さらに掘り下げたい場合は、ここに参考資料があります。

https://developer.Apple.com/documentation/uikit/accessibility/uiaccessibility

https://developer.Apple.com/documentation/uikit/uiaccessibilitylayoutchangednotification

https://developer.Apple.com/documentation/uikit/uiaccessibilityscreenchangednotification

そして最後に、私がこのすべてのものをテストするためにまとめたばかげた小さなアプリのオープンソースリポジトリです。

https://github.com/chriscm2006/IOS-A11y-Api-Test

53
ChrisCM