タッチイベント
AppleWatch
swift4
WKInterfaceButton

AppleWatchでボタンのタッチ開始と終了タイミングを検知する方法

はじめに

スマートウォッチで色々楽しいことができるといいなとワクワクしながらAppleWatchを買った筆者であったが、あまりの制限の多さに絶望...
ボタンのタッチ開始、終了のタイミングもわからないじゃないか...
いや待て、できるかもしれない。ヤツを使えば...。

解決方法概要

Long Press Gesture Recognizerを本来とは間違った方法で使う。
このジェスチャイベントはなぜかわからないが、longPressの認識開始タイミングと終了のタイミングの二回にイベントハンドラを発動させる。そこで、longPressの認識開始タイミングをキーをタッチしてから0秒後にすることで、キーをタッチした瞬間とキーを離した瞬間の2回イベントハンドラを発動させることができるようになる。

実装方法

1.まずはButtonをInterface.storyboardに追加する。
2.続いてLong Press Gesture RecognizerをButtonの配下に追加する。
longpress.png
3.Long Press Gesture Recognizerをインスペクターで編集
Min Durationを0にする
4.Long Press Gesture RecognizerとInterfaceControllerをIBActionにて関連付けする
5.コーディング(タッチ開始と終了に分岐させて処理)

@IBAction func press(_ sender: Any) {
    let recognizer = sender as! WKLongPressGestureRecognizer
    if recognizer.state == .began {
        //タッチ開始の処理
    } else if recognizer.state == .ended || recognizer.state == .cancelled {
        //タッチ終了の処理   
    }
}

終わりに

AppleWatchは開発上の制限が非常に多く、思いついたことを実装するにはあまりにも環境が悪い。なぜ売れないのか、なぜ専用アプリが少ないのかは開発してみて初めて理解できた。
画像とボタンとラベルしか置けないのでは、ちょっとしたアニメーションやインタラクションを実装することも困難だ。BLEでHIDキーボードとして認識させることもできない。もっとデベロッパに自由を与えてほしい。切実にそう思う。