UISwipeGestureRecognizerで全方向認識する方法

スワイプ操作を上下左右4方向全部認識させる方法を説明します。

 

ジェスチャー認識の登録

UISwipeGestureRecognizerはプロパティにdirectionを持っていてこれでスワイプの方向を指定したり識別したりできます。このdirectionはtypedefで次のように定義されているので、OR演算して一度に指定できそうな雰囲気ですが、1方向づつ別々に登録する必要があります。

typedef enum {
    UISwipeGestureRecognizerDirectionRight = 1 << 0, //デフォルト
    UISwipeGestureRecognizerDirectionLeft  = 1 << 1,
    UISwipeGestureRecognizerDirectionUp    = 1 << 2,
    UISwipeGestureRecognizerDirectionDown  = 1 << 3
} UISwipeGestureRecognizerDirection;

実装例は次のようになります。

UISwipeGesture実装概要
    UISwipeGestureRecognizer *swipeRecognizer;
    //上方向スワイプの認識
    swipeRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self.myview action:@selector(swipe:)];
    swipeRecognizer.direction = UISwipeGestureRecognizerDirectionUp;
    [self.myview addGestureRecognizer:swipeRecognizer];
    swipeRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self.myview action:@selector(swipe:)];
    //下方向スワイプの認識
    swipeRecognizer.direction = UISwipeGestureRecognizerDirectionDown;
    [self.myview addGestureRecognizer:swipeRecognizer];
    swipeRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self.myview action:@selector(swipe:)];
    //右方向スワイプの認識
    swipeRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
    [self.myview addGestureRecognizer:swipeRecognizer];
    swipeRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self.myview action:@selector(swipe:)];
    //左方向スワイプの認識
    swipeRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
    [self.myview addGestureRecognizer:swipeRecognizer];

ジェスチャー認識時の処理

directionプロパティでジェスチャーの方向を判断して処理します。

-(void)swipe:(UISwipeGestureRecognizer *)gesture
{
    if (gesture.state == UIGestureRecognizerStateRecognized) {
        CGPoint startLocation = [gesture locationInView:self];
	    CALayer *hitLayer;
	    //スワイプ開始時のレイヤを取得
	    hitLayer = [self.baseLayer hitTest:startLocation];
	    if (hitLayer) {
		    //ジェスチャーの方向別の処理
            if (gester.direction == UISwipeGestureRecognizerDirectionUp){
            	//上方向スワイプの処理
            }else if (gester.direction == UISwipeGestureRecognizerDirectionRight){
            	//右方向スワイプの処理
            }else if (gester.direction == UISwipeGestureRecognizerDirectionDown){
            	//下方向スワイプの処理
            }else if (gester.direction == UISwipeGestureRecognizerDirectionLeft){
            	//左方向スワイプの処理
            }
        }
    }
}

ジェスチャーの開始点はhitTest:で調べます。