UIPanGestureRecognizer判断滑动的方向

.h文件

CGFloat const gestureMinimumTranslation = 20.0 ;
typedef enum : NSInteger {
    kCameraMoveDirectionNone,
    kCameraMoveDirectionUp,
    kCameraMoveDirectionDown,
    kCameraMoveDirectionRight,
    kCameraMoveDirectionLeft
} CameraMoveDirection ;

@interface FCDetailViewController : FCMainViewController
{
    CameraMoveDirection direction;
}

.m文件  --------

- (void)viewDidLoad
{
    [super viewDidLoad];

    //监听滑动手势
    UIPanGestureRecognizer *recognizer = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handleSwipeFrom:)];
    [self.view addGestureRecognizer:recognizer];
}

- (void)handleSwipeFrom:(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];

        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){
        //NSLog (@ "Stop" );
    }
}

- (CameraMoveDirection)determineCameraDirectionIfNeeded:(CGPoint)translation
{
    if (direction != kCameraMoveDirectionNone)
        return direction;

    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;
        }

    }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;
}
时间: 2024-10-29 20:01:44

UIPanGestureRecognizer判断滑动的方向的相关文章

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

CGFloat const gestureMinimumTranslation = 20.0; typedef enum :NSInteger { kCameraMoveDirectionNone, kCameraMoveDirectionUp, kCameraMoveDirectionDown, kCameraMoveDirectionRight, kCameraMoveDirectionLeft } CameraMoveDirection; @interfaceViewController

移动应用滑动屏幕方向判断解决方案,JS判断手势方向

问题分类 滑动屏幕打开相应功能操作. 问题描述 1.用户手动滑动屏幕,根据滑动的方向,打开相应的功能(如:向上滑摇钱树经验明细,向下滑打开任务明细,向左滑打开聚宝盆物品查看等功能),滑动事件捕获问题. 2.大家都知道,划动都有角度问题,如:向330度方向滑动手机,要计算出它的方向问题. 3.HTML5提供的滑动事件,只能读取到起点和终点坐标,计算角度问题. 4.手机屏幕坐标与标准坐标系转换问题. 解决方案 1.滑动屏幕事件使用HTML5 的touchstart滑动开始事件和touchend滑动结

移动端判断手势滑动的方向

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>触屏手指滑动计算演示--程序员老刘</title> </head> <body style="font-size:32px;"> <div style="width:100

使用C语言判断栈的方向

这一问题主要是如何判读出先后入栈的变量的地址大小,比如有a, b两个变量一先一后被定义,如果a的地址大于b的地址,则说明是以低地址方向增长的,反之,往高地址方向增长. 在写C程序的时候不能简单直接的定义两个变量来比较它们的地址大小,因为这样很有可能编译器会做优化,最终导致结果不真实.为避免这种编译器优化的情况,可以采用将变量定义到函数中,然后递归调用该函数.例如下面的代码: #include <stdio.h> static int stack_direction = 0; static vo

固定UIScrollView滑动的方向

一般而言,我们通过这两个参数CGRectMake以及contentSize就可以自动的让UIScrollView只往一个方向滚动.但我遇到过非常奇葩的情况,那就是即使设置的CGRectMake以及contentSize没有一点点问题,这个UIScrollView也能够上下左右滚动-_-!!. 为了不依赖于CGRectMake以及contentSize,我们可以通过在代理方法scrollViewDidScroll:中进行限制即可. 没有限制之前的效果: 源码: // // RootViewCont

js中判断鼠标滚轮方向的方法

  前  言 LiuDaP 最近无聊,在做自己的个人站,其中用到了一个关于鼠标滚轮方向判断的方法,今天闲来无聊,就给大家介绍一下吧!!!! 在介绍鼠标事件案例前,让我们先稍微了解一下js中的event对象 一.JS中的Event对象 Event对象:它代表的是事件的状态,例如可以表示鼠标的位置.鼠标按钮的状态.键盘按键的状态等等. >>>事件通常与函数结合使用,函数不会在事件发生前被执行! 二.JS中如何判断鼠标滚轮方向 判断鼠标滚轮的方向,有着两个派别:一是谷歌.IE派别(这次IE没有

javascript判断移动应用手势滑动屏幕方向

方案思路: 1.滑动屏幕事件使用HTML5 的 touchstart 滑动开始事件和 touchend 滑动结束事件. 2.方向的判断,以起点做平面坐标系,与终点连线做直线,直线与x正半轴计算角度:我们以45度角为方向分割线,如:只要滑动角度大于等于45度且小于135度,则判断它方向为向上滑. 3.使用Math.atan2()来计算起点与终点形成的直线角度. 4.仔细对比标准坐标系与屏幕坐标系,我们发现,标准坐标系,上半轴为负值,要实现转换,只需要调换Y坐标起点与终于位置即可. 代码实现: [网

关于手机端 手势滑动的方向的判断(方式一)

滑动屏幕    touchstart:接触屏幕时触发,touchmove:活动过程触发,touchend:离开屏幕时触发 首先获取手接触屏幕时的坐标X,Y //获取接触屏幕时的X和Y $('body').bind('touchstart',function(e){ startX = e.originalEvent.changedTouches[0].pageX, startY = e.originalEvent.changedTouches[0].pageY; }); 然后获取滑动的坐标,并使用

判断tableVIew滑动的方向

首先设置一个旧的偏移量为0; self.oldContent = 0; - (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (scrollView.contentOffset.y > _oldContent) { //如果当前位移大于缓存位移,说明是tableView向下移动 [self foldingViewDidAnimateToFold]; } else { [self foldingViewDidAnimateToFla