【watchOS】画面をタップせずに手のジェスチャだけで操作するAssistiveTouchを試してみた
watchOS 8で追加されたAssistiveTouchにとても興味があったので実際に試してみることにしました。
AssistiveTouch機能はiPhone、iPadにもありますが、今回はwatchOSのAssistiveTouchを試したものになりますので、ここでいうAssistiveTouchはwatchOSのものだと思っていただければと思います。
WWDC21: Create accessible experiences for watchOSの発表を参考しながら試してみたのでこちらの発表を見ていただくとより詳細な情報が載っているかと思います。
環境
- watchOS 8.0.1
- Xcode 13.0
AssistiveTouchとは
片手のジェスチャだけで Apple Watchを操作できる機能です。 詳しい説明は、Apple Watch で AssistiveTouch を使うに記載されています。 その中からいくつか項目を抜粋してお伝えいたします。
AssistiveTouchを有効にする
Apple Watch
> 設定 App
> アクセシビリティ
> AssistiveTouch
のボタンをOnすると有効になります。
手のジェスチャだけで操作するにはハンドジェスチャもオンになっている必要があるのでオンになっているか確認しておきましょう。
ハンドジェスチャ
ハンドジェスチャでは、決められた4つのジェスチャに対してどういう操作をするか割り当てることが出来ます。 各ジェスチャに対してデフォルトで操作が割り当てられていますが、操作内容はカスタムすることも可能になっています。
クレンチ ?
- 手を開いた状態からグーにする動作
- デフォルトでは「タップ」が割り当てられています
ダブルクレンチ ??
- クレンチを素早く二回行う動作
- デフォルトでは「アクションメニュー」が割り当てられています
ピンチ ?
- 人差し指と親指を摘む動作
- デフォルトでは「順方向」が割り当てられています
- 順方向にフォーカスが移動していきます
ダブルピンチ ?
- ピンチを素早く二回行う動作
- デフォルトでは「逆方向」が割り当てられています
- 逆方向にフォーカスが移動していきます
Appleのアプリで試してみる
AppleのストップウォッチアプリでAssistiveTouchを試してみました。
実際にクレンチとピンチの動きだけ操作できているのが伝わると思います。
自作アプリでも試してみる
今回はAssitiveTouchを試す為にこのようなアプリを作成してみました。
画面の中央にText
を配置して、下部には横一列でButton
を三つ配置しています。
自作アプリのコード
import SwiftUI struct ContentView: View { @State var expression = "?" var body: some View { VStack { Text(expression) .font(.system(size: 80)) .accessibilityRespondsToUserInteraction() .onTapGesture { expression = "?" } HStack { Button { expression = "?" } label: { Text("?") .font(.system(size: 30)) } .accessibilityAddTraits(.isButton) Button { expression = "?" } label: { Text("?") .font(.system(size: 30)) } Button { expression = "?" } label: { Text("?") .font(.system(size: 30)) } } } } }
ボタンがタップされると、その絵柄に中央のテキストが変わるシンプルなものになります。 また画面中央のラベルがタップされると"?"のテキストに変わる実装としています。
onTapGestureに対応する
Button
は.accessibilityAddTraits(.isButton)
の追加実装することなく理想の動きをしてくれたのですが、静的要素に対してonTapGesture
を行いたい場合は、そのままではアクセシビリティに対応してくれません。
今回は、Text
に対して下記のコードを記述してアクセシビリティに対応させました。
Text(expression) .font(.system(size: 80)) .accessibilityRespondsToUserInteraction() .onTapGesture { expression = "?" }
accessibilityRespondsToUserInteraction()
はアクセシビリティでのユーザー操作に反応するかを引数によって決めるメソッドです。
この引数はrespondsToUserInteraction: Bool = true
になっており、値を入れない場合はユーザー操作への反応が有効になります。
これでアクセシビリティとして選択可能になり、onTapGusture
もAssistiveTouch上で動いてくれるようになりました。
完成したアプリ
その他に試してみたもの
BLE通信できるレゴの列車を諜報部員のようにタップ操作することなく手のジャスチャだけで操作してみました。
まるでスパイの小道具のように片手の動きだけでレゴデュプロトレインを操作できるアプリがこちらです。
これで我が社の精鋭である諜報員を現地に派遣させます。 pic.twitter.com/cOACgA1TJW
— リルオッサ (@littleossa) October 17, 2021
おわりに
AssistiveTouch
を初めてみた時に勝手に手のジェスチャに紐付けて任意のコードが実行できる?を期待していましたが、そういう類のものではなくユーザーの操作を補助してくれるものだということが分かりました。
この機能やその他のアクセシビリティの機能ををうまく使えば、多様性の世の中で沢山の方達にもアプリを便利に楽しんで使ってもらえるような世界の実現へ向けて前進できるのではないかと感じました。