UIPanGestureRecognizer上下左右滑動方向判斷演算法

躍然發表於2014-07-17

CGFloat const gestureMinimumTranslation = 20.0;


typedef enum :NSInteger {

    kCameraMoveDirectionNone,

    kCameraMoveDirectionUp,

    kCameraMoveDirectionDown,

    kCameraMoveDirectionRight,

    kCameraMoveDirectionLeft

} CameraMoveDirection;


@interfaceViewController ()

{

    CameraMoveDirection direction;

}

@end


@implementation ViewController


- (void)viewDidLoad

{

    [super viewDidLoad];

    UIPanGestureRecognizer *recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)];

    [self.viewWithGestureRecognizer addGestureRecognizer:recognizer];

}


// This is my gesture recognizer handler, which detects movement in a particular

// direction, conceptually tells a camera to start moving in that direction

// and when the user lifts their finger off the screen, tells the camera to stop.

- (void)handleSwipe:(UIPanGestureRecognizer *)gesture

{

    CGPoint translation = [gesture translationInView:self.view];

    if (gesture.state ==UIGestureRecognizerStateBegan)

    {

        direction = kCameraMoveDirectionNone;

    }

    else if (gesture.state == UIGestureRecognizerStateChanged && direction == kCameraMoveDirectionNone)

    {

        direction = [self determineCameraDirectionIfNeeded:translation];


        // ok, now initiate movement in the direction indicated by the user's gesture

        switch (direction) {

            case kCameraMoveDirectionDown:

                NSLog(@"Start moving down");

                break;

            case kCameraMoveDirectionUp:

                NSLog(@"Start moving up");

                break;

            case kCameraMoveDirectionRight:

                NSLog(@"Start moving right");

                break;

            case kCameraMoveDirectionLeft:

                NSLog(@"Start moving left");

                break;

            default:

                break;

        }

    }

    elseif (gesture.state == UIGestureRecognizerStateEnded)

    {

        // now tell the camera to stop

        NSLog(@"Stop");

    }

}


// This method will determine whether the direction of the user's swipe

- (CameraMoveDirection)determineCameraDirectionIfNeeded:(CGPoint)translation

{

    if (direction != kCameraMoveDirectionNone)

        return direction;

    // determine if horizontal swipe only if you meet some minimum velocity

    if (fabs(translation.x) > gestureMinimumTranslation)

    {

        BOOL gestureHorizontal = NO;

        if (translation.y ==0.0)

            gestureHorizontal = YES;

        else

            gestureHorizontal = (fabs(translation.x / translation.y) >5.0);

        if (gestureHorizontal)

        {

            if (translation.x >0.0)

                return kCameraMoveDirectionRight;

            else

                return kCameraMoveDirectionLeft;

        }

    }

    // determine if vertical swipe only if you meet some minimum velocity

   else if (fabs(translation.y) > gestureMinimumTranslation)

    {

        BOOL gestureVertical = NO;

        if (translation.x ==0.0)

            gestureVertical = YES;

        else

            gestureVertical = (fabs(translation.y / translation.x) >5.0);

        if (gestureVertical)

        {

            if (translation.y >0.0)

                return kCameraMoveDirectionDown;

            else

                return kCameraMoveDirectionUp;

        }

    }

    return direction;

}


@end

相關文章