UIPanGestureRecognizer上下左右滑动方向判断算法

来源:互联网 发布:linux c语言 文件路径 编辑:程序博客网 时间:2024/06/13 03:45

CGFloat const gestureMinimumTranslation = 20.0 ;

typedef enum : NSInteger {

    kCameraMoveDirectionNone,

    kCameraMoveDirectionUp,

    kCameraMoveDirectionDown,

    kCameraMoveDirectionRight,

    kCameraMoveDirectionLeft

} CameraMoveDirection ;

@interface ViewController ()

{

    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 ;

        }

    }

    else if (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


0 0
原创粉丝点击