ハイライト
Switch Control は iOS 組み込みの補助機能で、運動能力が制限されたユーザーが外部スイッチで画面上のカーソルを操作できます。このセッションでは、
accessibilityNavigationStyle、accessibilityElements、フォーカスコールバック、UIAccessibilityCustomActionを使ってスキャン待ちを減らし、カード内容を自動表示し、ダブルタップや長押し操作をトップレベルメニューに移す方法を示します。
主要内容
Switch Control ユーザーは、車椅子のスイッチ、頭部タップ、舌タップ、ストロー呼吸などでデバイスを操作することが多いです。システムはカーソルを UI 要素間で移動し、ユーザーは目的の要素が選択されたらスイッチを押します。タッチユーザーが1回のタップで済む操作は、スイッチユーザーにとって待機、グループ進入、メニュー開閉、動作選択を意味することがあります。(00:59)
このセッションは Shape Shuffle という子ども向け学習ゲームで問題を説明します。曲がったレベルパス、めくるカード、頻繁なダブルタップと長押しがあります。タッチユーザーには自然ですが、Switch Control ユーザーは3つの障壁に直面します。レベルのスキャン順が不適切で遠いレベルに到達するのに長く待つ、各カードの内容を見るのに追加操作が必要、ダブルタップと長押しが gestures サブメニューに埋もれる。(05:15)
Apple の方針は明快です。まず App を VoiceOver 完全対応にし、多くの accessibility ラベルは Switch Control でも再利用されるからです。そのうえでスイッチユーザー向けの体験 polish を追加します。レベルをグループ化して明示的な順序で待ち時間を減らし、フォーカスコールバックでカードを自動めくり、よく使うジェスチャを Custom Actions でトップレベルに置きます。(04:22)
締めくくりでは、運動障害ユーザーの操作コストをプロダクトフローに組み込むよう促します。アカウント削除や全データ削除などの高リスク操作には確認が必要、認証コードやペアリングコード画面は Switch Control 実行中に短いタイムアウトを設けない、アカウントや医療などのプライバシー内容を含む画面は長時間の露出を減らす。(12:29)
詳細
スキャングループと順序を制御する
(07:49) Shape Shuffle のレベルは曲がったパスに沿っていますが、Switch Control はデフォルトで上から下、左から右にスキャンします。開発者はレベルのグループを1つのスキャングループにまとめ、グループ内の要素順を明示できます。
containerView.accessibilityNavigationStyle = .combined
containerView.accessibilityElements = [levelFourView, levelFiveView, levelSixView]
キーポイント:
accessibilityNavigationStyle = .combinedでコンテナ内の要素を1つの組み合わせとしてスキャンに参加させ、トップレベル要素数を減らします。accessibilityElementsはデフォルトの幾何学的ソートを上書きし、曲がったパス、盤面、地図など視覚順と読み順が一致しない UI に適します。- level 30 のような遠いターゲットの待ち問題に直接効きます。ユーザーはまず正しいグループに入り、設計順でグループ内を移動します。
フォーカスで内容を自動表示する
(08:47) カードゲームはタップでめくる前提です。手動スキャンの Switch Control ユーザーはカードごとに追加操作が必要で、枚数に比例してコストが増えます。セッションの方法は、カードが accessibility フォーカスを得たら表に、失ったら裏に戻します。
class CardView: UIView {
var orientation: CardOrientation
enum CardOrientation {
case front
case back
}
override func accessibilityElementDidBecomeFocused() {
self.flip(to: .front)
}
override func accessibilityElementDidLoseFocus() {
self.flip(to: .back)
}
// 残りの class 内容...
}
キーポイント:
accessibilityElementDidBecomeFocused()は accessibility フォーカスがカードに到達したときに呼ばれます。self.flip(to: .front)で通常はタップが必要な内容を先に見せます。accessibilityElementDidLoseFocus()でフォーカスが外れたら裏に戻し、ゲームルールを維持します。- この動作はユーザー設定にできます。transcript では自動スキャンユーザーには不要な場合もあり、手動スキャンユーザーがより恩恵を受けると述べています。
よく使うジェスチャをトップレベルメニューに置く
(09:15) ゲームではダブルタップでカード追加、長押しで pin します。Switch Control ユーザーはこれらのジェスチャを実行できますが、gestures サブメニューに頻繁に入る必要があります。UIAccessibilityCustomAction で常用操作をトップレベルメニュー項目にし、メニュー階層を浅くします。
func configureActions() {
let pinAction = UIAccessibilityCustomAction(
name: "Pin Card") { (_) -> Bool in
self.setPinned(true)
return true
}
pinAction.image = UIImage(systemName: "pin")
let addAction = UIAccessibilityCustomAction(
name: "Add Card") { (_) -> Bool in
self.setSelected(true)
return true
}
addAction.image = UIImage(systemName: "add.square")
self.accessibilityCustomActions = [addAction, pinAction]
}
キーポイント:
- 各
UIAccessibilityCustomActionはユーザーが起動できる動作に対応します。 - closure が
trueを返すと動作が処理されたことを示します。 accessibilityCustomActionsは現在のビューが Switch Control メニューに公開する操作を決めます。- iOS 14 では custom action に
imageを設定可能。セッションは pin と add に SF Symbols を使用。画像がない場合は動作名の頭文字が表示されます。
Switch Control と静的テキストのインタラクションを検出する
(11:41) セッションは小さな API を2つ紹介します。Switch Control が実行中かどうかを判定するものと、静的テキストのように見えてタップに応答する要素を Switch Control ナビゲーションに含めるものです。
static var isSwitchControlRunning: Bool { get }
var accessibilityRespondsToUserInteraction: Bool { get set }
キーポイント:
isSwitchControlRunningは Switch Control 向け体験の切り替えに適し、認証コードページのタイムアウト延長などに使えます。- transcript では状態変化時に UI を更新する notification も言及しています。
accessibilityRespondsToUserInteractionはタップに応答するUILabelのような静的な見た目の要素に適します。- 設定後、Switch Control はこれらをナビゲーション対象として扱い、隠れたインタラクションを見逃しにくくなります。
誤タップと遅い入力に余地を残す
(12:44) 運動障害ユーザーは tremor などの非自発的動作があり、誤タップの確率が高くなります。高リスク操作には確認が必要、認証・ペアリングコード画面は Switch Control 実行中に短いタイムアウトを避ける、アカウントや医療などのプライベート情報を含む画面は敏感な内容を早く片付ける。
キーポイント:
- 全データ削除、ログアウト、アカウント削除などには確認フローが必要です。
- 入力が遅く、修正も遅いのは autoscanning の直接結果。セキュリティフローはタッチユーザーの速度だけで設計できません。
- デバイスは車椅子に固定されていることがあり、手持ちより画面のプライバシー条件が弱いです。
重要ポイント
スイッチ向けカード学習モード
何をするか: 記憶カード、語学学習、子どもの認知ゲームに Switch Control モードを追加し、フォーカス到達時に内容を自動表示する。
なぜ価値があるか: セッションのカード例は、めくるたびにタップが必要だと手動スキャンユーザーが疲労することを示しています。
始め方: カード UIView に accessibilityElementDidBecomeFocused() と accessibilityElementDidLoseFocus() を実装し、めくりロジックをフォーカスライフサイクルに入れ、自動めくりをオンにする設定項目を提供する。
レベル、盤面、地図のグループスキャン
何をするか: レベルマップ、座席図、盤面、フロア図でタスク順に沿ったスキャングループを構築する。
なぜ価値があるか: デフォルトの上から下、左から右の順序は曲がったパスや空間レイアウトを壊し、ターゲット到達まで待ちが長くなります。
始め方: コンテナビューで要素グループを保持し、accessibilityNavigationStyle = .combined を設定し、accessibilityElements をユーザーがタスクを完了する実際の順序に並べる。
トップレベルメニューの高頻度アクション
何をするか: pin、完了、お気に入り、回答追加などの高頻度アクションを Switch Control トップレベルメニューに置く。
なぜ価値があるか: ダブルタップ、長押し、スワイプアクションは到達可能ですが、gestures サブメニューに繰り返し入るとフローが遅くなります。
始め方: 各動作に UIAccessibilityCustomAction を作成し、closure で既存のビジネスメソッドを呼び、要素の accessibilityCustomActions に割り当てる。
短いタイムアウトのない認証フロー
何をするか: Switch Control 実行中のログイン、ペアリング、認証コード画面でより寛容な時間枠を使う。
なぜ価値があるか: autoscanning ユーザーは入力も修正も遅く、短いタイムアウトは補助技術ユーザーをフローから締め出します。
始め方: isSwitchControlRunning を読み、その状態でカウントダウンを延長、自動閉じを一時停止、再送前の明確な確認を提供する。
インタラクティブラベルの accessibility 公開
何をするか: テキストのように見えてタップに応答する統計項目、ステータスラベル、小さなコントロールを Switch Control ナビゲーションに含める。
なぜ価値があるか: Switch Control はユーザー操作に応答することを知る必要があり、そうでなければ重要な入口をスキャンで見逃す可能性があります。
始め方: そのような要素に accessibilityRespondsToUserInteraction = true を設定し、label、traits、トリガー後の状態フィードバックを補完する。
関連セッション
- Make your app visually accessible — 色、文字サイズ、Button Shapes、Smart Invert などの設定から視覚的アクセシビリティの基礎を確認する。
- Create a seamless speech experience in your apps — AVSpeechSynthesizer、assistive technology announcement、音声出力のタイミングを扱う。
- VoiceOver efficiency with custom rotors — custom rotors で VoiceOver ユーザーが複雑な UI で関連コンテンツに素早くジャンプできるようにする。
- Accessibility design for Mac Catalyst — Mac Catalyst App のキーボード、マウス、要素グループ化、Accessibility Inspector テストを議論する。
- Build for the iPadOS pointer — マウス、トラックパッド、その他の間接入力デバイスへの適応を続ける。
コメント
GitHub Issues · utterances