アクセシビリティのサポートに関する一般的な情報については、Accessibility(アクセシビリティ、Framework) を参照してください。設計のガイダンスについては、ヒューマンインターフェイスのガイドライン > アクセシビリティ を参照してください。
アクセシビリティ特性を RealityKit の実体に追加
VoiceOver およびその他の支援技術は、あなたのアプリのビューとコンテンツが提供するアクセシビリティ情報に依存しています。SwiftUI と UIKit は標準システムビューのデフォルト情報を提供しますが、RealityKit はシーン内の実体のデフォルト情報を提供しません。
RealityKit の実体 (entity) のアクセシビリティ情報を構成するには、AccessibilityComponent のインスタンスを実体に追加します。このコンポーネントを使用して、あなたのアプリの残りのビューに指定するのと同じ値を指定します。以下の例は、このコンポーネントを作成して実体に追加する方法を示しています。
- var accessibilityComponent = AccessibilityComponent()
- accessibilityComponent.isAccessibilityElement = true
- accessibilityComponent.traits = [.button]
- accessibilityComponent.label = "Sports car"
- accessibilityComponent.value = "Parked"
- accessibilityComponent.systemActions = [.activate]
- myEntity.components[AccessibilityComponent.self] = accessibilityComponent
人々は VoiceOver を使用して、実体に対して特定の型のアクションを開始できます。あなたの実体がその値の増加または減少をサポートしている場合、または標準のタップ以外のジェスチャによる活性化をサポートしている場合は、コンポーネントの systemActions プロパティに値を割り当てます。標準のシングルタップジェスチャを使用して実体を操作できるようにする場合、システムアクションを設定する必要はありません。
以下の例では、RealityView のコンテンツを使用して、ビューの実体で活性化イベントがいつ発生するかを判断します。ビューの活性化イベントを予約した後、コードは受信イベントを処理する非同期タスクを設定します。新しいイベントが発生すると、タスクはカスタムコードを実行して衝突を処理します。
- activationSubscription = content.subscribe(to: AccessibilityEvents.Activate.self,
- on: nil, componentType: nil) { activation in
- Task {
- try handleCollision(for: activation.entity, gameModel: gameModel)
- }
- }
ダイレクトジェスチャモードのサポートを追加
visionOS で VoiceOver がアクティブになっている場合、人々は手のジェスチャを使用してあなたのアプリのインターフェイスをナビゲートし、要素を検査します。アプリのコードが VoiceOver の操作に干渉するのを防ぐため、この間、システムはアプリに手での入力を提供しません。ただし、特別な VoiceOver ジェスチャを実行してダイレクトジェスチャモードを有効にすることはできます。これにより、VoiceOver は有効なままになりますが、あなたのアプリへの手での入力が復元されます。
VoiceOver アナウンスをあなたのコードに追加して、意味のあるイベントの結果を伝えます。VoiceOver はこれらのアナウンスを常に読み上げますが、ダイレクトジェスチャモードがオンの場合に特に便利です。以下の例では、カスタムジェスチャによってゲームピースの操作が発生したときにアナウンスを投稿します。
身体の動きを伴う入力の代替手段を提供
移動性が低下すると、あなたのアプリのコンテンツを操作する人の能力に影響が出ます。あなたのアプリの入力モデルを設計するときは、特定の体の動きや位置を必要とする体験を避けてください。たとえば、あなたのアプリがカスタムハンドジェスチャをサポートしている場合は、各ジェスチャにメニューコマンドを追加して、誰かがキーボードや支援デバイスを使用して入力できるようにします。
一部の支援技術では、人々が目だけを使ってあなたのアプリを操作できるようになります。これらの技術を使用して、あなたのインターフェイス内の項目を選択、スクロール、長押し、またはドラッグすることができます。他の型の操作をサポートしている場合でも、これらの操作のみを使用してあなたのアプリのすべての動作にアクセスする方法を人々に提供してください。
頭に固定されたコンテンツを避ける
(注 head-anchored を「頭に固定された」と訳しています)
一部の支援技術では、人々は頭の動きを使用してあなたのアプリのインターフェイスをナビゲートしたり表示したりできます。人の頭が動くと、支援技術は目の前のアイテムに焦点を合わせます。人の頭の動きに従うコンテンツは、これらの支援技術の動作を妨げます。
インターフェイスを設計するときは、コンテンツをウィンドウに配置するか、仮想カメラ以外の場所に固定します。頭に固定されたコンテンツが必要な場合は、関連する支援技術が使用されているときに代替の解決策を提供してください。たとえば、頭に固定されたコンテンツを、人の頭の動きに従わないアンカーポイントに移動する場合があります。
コンテンツを固定するアプローチをいつ変更するかを決定するには、SwiftUI の accessibilityPrefersHeadAnchorAlternative 環境変数を確認するか、AXPrefersHeadAnchorAlternative() 関数を呼び出します。この環境変数は、頭に固定されたコンテンツと競合する支援技術が使用されている場合には true になります。その時点で代替アンカーメカニズムを使用するようにコンテンツを調整して下さい。
コンテンツ内のモーションエフェクトを制限
没入型デバイスのモーションエフェクトは、動きに敏感でない人にとっても不快に感じる可能性があります。素早い動き、跳ねる動きや波のような動き、ズームアニメーション、多軸の動き、スピン、回転などを組み込んだモーションエフェクトの使用を制限します。デバイスを装着している人がモーションエフェクトに敏感な場合は、これらのエフェクトの使用を完全に排除してください。
Reduce Motion (モーションを制限する) システム設定を使用すると、あなたのアプリのすべてのモーションエフェクトの代替策をいつ提供するかを知ることができます。この設定にアクセスするには、SwiftUI の accessibilityReduceMotion 環境変数、または UIKit の isReduceMotionEnabled プロパティを使用します。この設定が true の場合、モーションエフェクトに適切な代替手段を提供するか、モーションエフェクトを完全に排除します。たとえば、ビデオの代わりに海の静かなスナップショットを表示します。
詳細については、「ヒューマンインターフェイスガイドライン > モーション」を参照してください。
音声コンテンツにキャプションを含める
聴覚に障害のある人のために、あなたのアプリのコンテンツに高品質のキャプションを提供して下さい。キャプションは一部の人にとっては必需品ですが、特定の状況では誰にとっても実用的です。たとえば、キャプションは、騒がしい環境でビデオを見ている人にとって役立ちます。コンテンツ内のテキストや会話だけでなく、音楽や効果音にもキャプションを含めてください。空間オーディオコンテンツの場合は、さまざまな音の方向を示す情報をキャプションに含めて下さい。
AVKit と AVFoundation は、キャプション付きコンテンツを表示するための組み込みサポートを提供します。これらのフレームワークは、人のアクセシビリティ設定に従って、キャプションのフォント、サイズ、色、スタイルを自動的に構成します。たとえば、フレームワークはテキストを表示するときに現在のダイナミックタイプ設定を採用します。
カスタムビデオエンジンを使用している場合は、isClosedCaptioningEnabled のアクセシビリティ設定を確認して、いつキャプションを表示するかを決定します。キャプション付きコンテンツの正しい外観情報を取得するには、あなたのプロジェクトに メディアアクセシビリティ (Media Accessibility) を導入します。このフレームワークは、キャプション付きのテキストとイメージに適用すべき最適なフォント、色、不透明度の情報を提供します。
以下も見よ
デザイン
  プライバシーとユーザ設定のベストプラクティスを採用 (Adopting best practices for privacy and user preferences)
機密情報の使用を最小限に抑え、使用するどの情報をどのように使用するかを明確に記述してください。
トップへ
トップへ
トップへ
トップへ
トップへ
トップへ
トップへ
トップへ
トップへ
トップへ
トップへ
トップへ
トップへ
トップへ
トップへ
トップへ
トップへ
トップへ