目次
Session概要
Switch Controlはモビリティ(機動性)に多大な制限を受ける人にとって非常にパワフルなアクセシビリティテクノロジーとなります。その機能はiOS上でネイティブに提供され、tips、ticksといくつかのAPIを使いより優れたSwitch Controlを作成することも可能です。他の人がどのようにSwitch Controlを使っているかを紹介し、アプリの中で効果的にこれらを提供する成功事例も紹介します https://developer.apple.com/videos/play/wwdc2020/10019/Switch Controlとは
- 運動機能に制限のあるユーザが外部スイッチやボタンでiOSデバイスを操作するための機能
- スイッチで画面上のカーソルを操作することが可能
- ユーザが行うアクション
- タップ
- ジェスチャー
- スクロール
- 音量調整
- 対象ユーザの多くは手足の使用が制限されている
- よってスイッチやボタンを車椅子に取り付け、頭でのタップ、舌でのクリック、呼吸により操作するのが一般的
- デバイスを電動車椅子に取り付ければ、充電しながら使うことも可能
- 様々な口の動きにより、カーソルの移動やタップが可能
- 実際に使用している様子はSessionの動画内で紹介されています。(1:50〜2:30)
- Switch Controlを使用しないユーザにとっては簡易なUIであっても、Switch Controlを使用するユーザにとっては何ステップも介して操作していることが目に見えてわかるので重要性を感じられるかと思います。
- その他、操作するまでカーソルが項目を移動し続ける自動スキャンを使用するユーザも多い
Switch Controlのユーザを対象とするアプリを開発する際の注意点
- 自動スキャンの場合、希望の項目やグループにカーソルが移った時にすぐタップする必要がある
- 項目の効率性とグループ化も重要
- グループ化に問題があると項目の選択に時間がかかります
- 震えやその他の不随意運動があるユーザの場合、他の介助技術の使用時よりもタップミスの確率が高くなり得る
- データの削除やログアウトのUIを誤ってタップすると不都合が発生するため、エラーに対する耐性が重要
- 大抵のケースでSwitch Control用の特別対応は不要
- VoiceOverに100%アクセス可能なアプリを開発すれば問題ない
- ただし、操作性向上のため特別対応が必要になることがある
- 例えば、VoiceOverに適用されない動作が必要な場合
Switch Control ユーザのサポートに使用可能なAPI
- Switch Controlのカーソルは上から下、左から右へ動く
- そのため、ユーザの意図と体験にギャップが生まれるデザイン、レイアウトだとユーザビリティは低くなる
- 手動スキャンを設定している場合、スイッチを何度も操作しなければならない、アプリの設計にならないように注意する
- ダブルタップと長押しを頻繁に実行する必要が頻繁にあると時間がかかる
画面内に選択する項目が多すぎて順序通りスキャンできない場合
- Switch Controlにレベルをグループ化させるため、accessibilityNavigationStyleをcombinedと設定する
- 要素の順序を制御して、上から下、左から右の順序にならないようにするために、Accessibility Elementsの配列で正しい順序を返すよう明確に設定する
- accessibilityElementDidBecomeFocused がViewの焦点が合うたびに呼び出され、accessibilityElementDidLoseFocus がViewの焦点から外れると呼び出される
- このAPIを使用して、ユーザのタップ操作を減らす
Accessibility Custom Actions

- Custom Actionsを用いるとVoiceOverやSwitch Controlなどの介助技術でも簡単にアプリを操作することができる
- 例えば、リマインダーでは削除やフラグなどのスワイプ動作はCustom Actionsとして表示される
- これらの項目をカーソルを移動する必要があるViewにしないことで混乱を大幅に減らせる
- また、一般的な動作がより速く、より簡単にできるようになる
- カスタムアクションの詳細はこちらを参照
- UIAccessibilityCustomAction を作成し、メニューに頻繁に利用するアクションを追加する
- iOS 14からはカスタムアクションの画像を設定できるようになった
- 画像を使用しない場合は、デフォルトの動作が表示される
// Custom Actions API (VoiceOver uses this too)
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]
}

iOS 14から利用可能なAPI
- Switch Controlが実行中か確認する方法
- UILabelなどのユーザがタップすると更新されるような静的UIがある場合に、静的テキストに見えてもこの項目に移るようにSwitch Controlに伝えるために、 accessibilityRespondsToUserInteractionをtrueにする
static var isSwitchControlRunning: Bool { get }
var accessibilityRespondsToUserInteraction: Bool { get set }
ベストプラクティス
- 運動機能に障害があるユーザも使いやすくする方法
- 破壊的な動作や重要度の高い動作はユーザの確認を得るようにする
- データの一括削除やアカウントの削除リスクがあるので重要
- Switch Controlの実行中はアプリで制限時間を設けるのは避ける
- ペアリングコードや認証コードの入力画面では、防犯上制限時間を短く設定しがちですが、Switch Controlのユーザはカーソルが合うのを待たないと入力できず、入力エラーの修正にも時間がかかるため制限時間があると不便
- 画面上の項目をグループ化しやすいようViewの階層構造を工夫する
- 明確でわかりやすい項目のグループ化は全ユーザのためになる
- グループ化はカーソル操作の効率と速度により重要な影響を与える
- 車椅子に取り付けられたデバイスを使うユーザの場合、画面上の入力情報の保護が難しいことを覚えておく
- 口座番号や医療情報などの個人情報を必要以上に画面に表示しないようにする