3本指のピンチジェスチャーを作る 3

touchesMovedの実装

次にtouchesMovedを実装していきます。

ここでやることは単純でタッチポイント間の距離を求めて、touchsBegan時点で保存した距離との比率を
プロパティscaleに保存すればOK

ただし、念のため3点以外でタッチされた時はジェスチャーを失敗させます。
また、stateがUIGestureRecognizerStatePossibleの時はUIGestureRecognizerStateBeganに書き換えておきます。


- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesMoved:touches withEvent:event];
    
    int numberOfTouches =  event.allTouches.count;
    if (numberOfTouches != 3)
    {
        if (self.state == UIGestureRecognizerStatePossible)
        {
            self.state = UIGestureRecognizerStateFailed;
        } else {
            self.state = UIGestureRecognizerStateCancelled;
        }
        return;
    }
    
    UITouch *first = [[event.allTouchesallObjects] objectAtIndex:0];
    UITouch *second = [[event.allTouchesallObjects] objectAtIndex:1];
    UITouch *third = [[event.allTouchesallObjects] objectAtIndex:2];
    
    float distance = [self calcDistance:[first locationInView:self.view]
                                     p2:[second locationInView:self.view]
                                     p3:[third locationInView:self.view]];
    
    self.scale = distance / _distance_initial;
    
    if (self.state == UIGestureRecognizerStatePossible)
    {
        self.state = UIGestureRecognizerStateBegan;
    } 
    
    
}

後処理の実装

あとは終了処理とキャンセルの処理を実装すれば完成です

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesEnded:touches withEvent:event];
    
    switch (self.state) {
        caseUIGestureRecognizerStatePossible: 
        caseUIGestureRecognizerStateFailed:    
            self.state = UIGestureRecognizerStateFailed;
            break;
        caseUIGestureRecognizerStateBegan:
        caseUIGestureRecognizerStateChanged:
            // 正常に終了
            self.state = UIGestureRecognizerStateEnded;
            break;
        default:
            // 上記以外はキャンセル扱い
            self.state = UIGestureRecognizerStateCancelled;
            break;
    }
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    [supertouchesCancelled:touches withEvent:event];
    self.state = UIGestureRecognizerStateFailed;
    self.scale = 1;
}


使い方

使い方は通常のUIPinchGestureRecognizerと大体同じ

ジェスチャーをUIViewに登録して

ThreeFingersPinchGestureRecognizer *pinch = [[[ThreeFingersPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchAction:)] autorelease];
[self.view addGestureRecognizer:pinch];

ハンドリング

- (void)pinchAction : (ThreeFingersPinchGestureRecognizer *)sender 
{
  //sender.scale を使って拡大縮小などを行う
}

ファイル

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です