[watchOS 3] watchOS に Gesture Recognizer が来た!

2016.09.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

待ってました!

watchOS のバージョンも 3 に上がり、Apple Watch でも Gesture Recognizer の機能が利用できるようになりました。
実は watchOS 2 まで、この機能は存在しなかったんですね。

watchOS のジェスチャー

watchOS に追加されたジェスチャーは以下の 4 つです。

  • WKLongPressGestureRecognizer
    • 長押し
  • WKPanGestureRecognizer
    • ドラッグ
  • WKSwipeGestureRecognizer
    • スワイプ
  • WKTapGestureRecognizer
    • タップ

iPhone で利用できる以下の様なジェスチャーは実装されていません。

  • UIPinchGestureRecognizer
    • ピンチ
  • UIRotationGestureRecognizer
    • 回転
  • UIScreenEdgePanGestureRecognizer
    • 画面端ドラッグ

Apple Watch は画面が小さく回転もしないため、この 3 つは不要ですね。

WKGestureRecognizer

WKGestureRecognizer は上記 4 つのジェスチャークラスの親クラスです。

@available(watchOS 3.0, *)
open class WKGestureRecognizer : NSObject {


    open var state: WKGestureRecognizerState { get } // abstract class

    open var isEnabled: Bool


    open func locationInObject() -> CGPoint // always refers to the interface object the gesture recognizer is attached to

    open func objectBounds() -> CGRect // locationInObject's viewBounds
}

state プロパティは Gesture Recognizer の現在の状態を返します。
状態は以下のとおり。

@available(watchOS 3.0, *)
public enum WKGestureRecognizerState : Int {


    case possible // = UIGestureRecognizerStatePossible

    case began // = UIGestureRecognizerStateBegan

    case changed // = UIGestureRecognizerStateChanged

    case ended // = UIGestureRecognizerStateEnded

    case cancelled // = UIGestureRecognizerStateCancelled

    case failed // = UIGestureRecognizerStateFailed

    case recognized // = UIGestureRecognizerStateRecognized
}

UIGestureRecognizerState と同じです。

isEnabled プロパティは Gesture Recognizer が有効かどうかを示します。
これが false の場合はジェスチャーを検知しません。

locationInObject() メソッドはタッチイベントの現在の位置を返します。

objectBounds() メソッドはジェスチャーが登録されているオブジェクトの bounds を返します。

WKLongPressGestureRecognizer

WKLongPressGestureRecognizer長押し イベントを検知します。

@available(watchOS 3.0, *)
open class WKLongPressGestureRecognizer : WKGestureRecognizer {


    open var minimumPressDuration: CFTimeInterval

    open var numberOfTapsRequired: Int

    open var allowableMovement: CGFloat
}

minimumPressDuration プロパティは長押しを検知するために必要な、ユーザーの指がオブジェクトに触れている最小時間(秒)です。

numberOfTapsRequired プロパティは長押しを検知するまでに必要なタップ回数です。

allowableMovement プロパティは長押し中にどれだけ指が動いていいかを示す距離です。
この値を大きくすると、オブジェクトを触れている間に指が多少ずれたとしても「長押し」と判定させることができます。

WKPanGestureRecognizer

WKPanGestureRecognizerドラッグ イベントを検知します。

@available(watchOS 3.0, *)
open class WKPanGestureRecognizer : WKGestureRecognizer {


    open func translationInObject() -> CGPoint // always refers to the interface object the gesture recognizer is attached to

    open func velocityInObject() -> CGPoint // always refers to the interface object the gesture recognizer is attached to
}

translationInObject() メソッドは現在のオブジェクトのドラッグの移動量を返します。
ドラッグ開始点が (0, 0) です。

velocityInObject() メソッドは現在のオブジェクトのドラッグ速度を返します。
値が大きいほど速く動いているということです。

WKSwipeGestureRecognizer

WKSwipeGestureRecognizerスワイプ イベントを検知します。

@available(watchOS 3.0, *)
open class WKSwipeGestureRecognizer : WKGestureRecognizer {


    open var direction: WKSwipeGestureRecognizerDirection
}

direction プロパティはスワイプ検知を許可する 方向 です。
デフォルトの方向は です。

@available(watchOS 3.0, *)
public struct WKSwipeGestureRecognizerDirection : OptionSet {

    public init(rawValue: UInt)


    public static var right: WKSwipeGestureRecognizerDirection { get } // = UISwipeGestureRecognizerDirectionRight

    public static var left: WKSwipeGestureRecognizerDirection { get } // = UISwipeGestureRecognizerDirectionLeft

    public static var up: WKSwipeGestureRecognizerDirection { get } // = UISwipeGestureRecognizerDirectionUp

    public static var down: WKSwipeGestureRecognizerDirection { get } // = UISwipeGestureRecognizerDirectionDown
}

1 つの WKSwipeGestureRecognizer には 1 つの direction しか設定できません。
複数の方向を設定したい場合は、複数の WKSwipeGestureRecognizer を用意しましょう。

WKTapGestureRecognizer

WKTapGestureRecognizerタップ イベントを検知します。

@available(watchOS 3.0, *)
open class WKTapGestureRecognizer : WKGestureRecognizer {


    open var numberOfTapsRequired: Int
}

numberOfTapsRequired プロパティはタップを検知するまでに必要なタップ回数です。
これを 2 にすることによりダブルタップを検知することができます。

最後に

Gesture Recognizer が追加されたことにより Apple Watch は、より操作性が上がると思います。
Apple Watch Series 2 が発表され GPU の性能も上がり、今後 Apple Watch でできることが増えてきそうですね。
選択肢が増えるというのは開発者としては嬉しいことです。
これからの Apple Watch の発展に期待しましょう。

リンク