美文网首页
手势识别

手势识别

作者: Mario_ZJ | 来源:发表于2016-09-01 17:14 被阅读79次

    监听触摸事件的做法

    • 如果想监听一个view上面的触摸事件,之前的做法是
      1.自定义一个view
      2.实现view的touches方法,在方法内部实现具体处理代码
    • 注意:通过touches方法监听view触摸事件,有很明显的几个缺点
      1.必须得自定义view
      2.由于是在view内部的touches方法中监听触摸事件,因此默认情况下,无法让其他外界对象监听view的触摸事件
      3.不容易区分用户的具体手势行为
    • iOS 3.2之后,苹果推出了手势识别功能(Gesture Recognizer),在触摸事件处理方面,大大简化了开发者的开发难度

    UIGestureRecognizer的使用

     1.什么是UIGestureRecognizer:
           UIGestureRecognizer手势识别器
      2.优点 :
           利用UIGestureRecognizer,能轻松识别用户在某个view上面做的一些常见手势
      3.注意点:
          UIGestureRecognizer是一个抽象类,定义了所有手势的基本行为,使用它的子类才能处理具体的手势
      4.UIGestureRecognizer的子类
            UITapGestureRecognizer(敲击)
            UIPinchGestureRecognizer(捏合,用于缩放)
            UIPanGestureRecognizer(拖拽)
            UISwipeGestureRecognizer(轻扫)
            UIRotationGestureRecognizer(旋转)
            UILongPressGestureRecognizer(长按)
    

    手势的使用

    注意:在使用手势时,涉及到形变的手势,不能使用make的transform方法
    //self.imageV.transform = CGAffineTransformMakeTranslation(point.x, point.y);
    因为当移动完毕后,在次点击拖动时,图片会回到最开始的位置,make的transform方法是相对于最原始的位置进行形变的而且只会执行一次,所以在拖动的时候,总是会回到起始点后,所以在拖动过程中,就会出现震颤的效果;
    可以使用没有make的transform方法
    self.imageV.transform = CGAffineTransformTranslate(self.imageV.transform, point.x, point.y);
    因为这个方法的形变值,是相对上一次而非最初的状态的形变值,因此获取相对最初位置的偏移量是累加了之前的偏移量的值,获取到的偏移值会比实际的偏移值大很多,但是需要的偏移量是要相对图片最初位置的偏移量,所以,在这里需要调用setTranslation: inView:方法,在拖动时,将上一次的偏移值清空,以获取拖动时相对初始位置的偏移值.

    • 1.UITapGestureRecognizer(敲击)
        /*************手势点按*************/
    -(void)tapTestGes{
        //创建手势
        UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGes)];//当图片没有接受到手势的触摸事件后,不会调用tap方法
        //给图片添加手势
        [self.imageV addGestureRecognizer:tap];
    }
    //手势的方法
    -(void)tapGes{
        NSLog(@"%s",__func__);
    }
    
    • 2.UIPinchGestureRecognizer(捏合,用于缩放)
        /*************捏合手势*************/
    -(void)pinchGes{
        UIPinchGestureRecognizer * pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGes:)];
        pinch.delegate = self;
        [self.imageV addGestureRecognizer:pinch];
    }
    //捏合手势的方法
    -(void)pinchGes:(UIPinchGestureRecognizer *)pinch
    {
        self.imageV.transform = CGAffineTransformScale(self.imageV.transform, pinch.scale, pinch.scale);//如果缩放倍数写成常数,那么久只能放大或缩小
        [pinch setScale:1];
    }
    
    • 3.UIPanGestureRecognizer(拖拽)
        /*************拖动手势*************/
    -(void)panGes{
        UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGes:)];
        [self.imageV addGestureRecognizer:pan];
    }
    //平移图片
    -(void)panGes:(UIPanGestureRecognizer *)pan
    {
        //获取图片相对最开始时的自己的位置
        CGPoint point = [pan translationInView:self.imageV];
        self.imageV.transform = CGAffineTransformTranslate(self.imageV.transform, point.x, point.y);
        //重置图片的移动距离(相对于上一次)
            NSLog(@"%@",NSStringFromCGPoint(point));
        [pan setTranslation:CGPointZero inView:self.imageV];
    }
    
    • 4.UISwipeGestureRecognizer(轻扫)
      //设置轻扫方向
      1.只有在同一水平方向上的手势可以拼接,不在同一水平方向上的手势不可以拼接
      2.拼接以后只能识别图片被轻扫了,但不能识别往哪个方向轻扫
      3.要想识别图片是往哪个方向轻扫了,需要添加两个轻扫手势对象,其中一个手势对象必须指明要滑动的方向
        /*************轻扫手势*************/
    -(void)swipeGes{
        //创建轻扫手势
        UISwipeGestureRecognizer * swipe1 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGes:)];
        //设置轻扫方向
        swipe1.direction =  UISwipeGestureRecognizerDirectionLeft;
        //给图片添加轻扫手势
        [self.imageV addGestureRecognizer:swipe1];
        //创建第二个轻扫手势
        UISwipeGestureRecognizer * swipe2 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGes:)];
        //给图片添加第二个轻扫手势
        [self.imageV addGestureRecognizer:swipe2];
    }
    //轻扫手势方法的实现
    -(void)swipeGes:(UISwipeGestureRecognizer *)swipe
    {
        if (swipe.direction == UISwipeGestureRecognizerDirectionLeft) {
            NSLog(@"向左轻扫图片");
        }else if (swipe.direction == UISwipeGestureRecognizerDirectionRight){
            NSLog(@"向右轻扫图片");
        }else{
        NSLog(@"无法识别轻扫图片的方向");
        }
    }
    
    • 5.UIRotationGestureRecognizer(旋转)
        /*************旋转手势*************/
    -(void)rotationGes{
        UIRotationGestureRecognizer * rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationGes:)];
        rotation.delegate = self;
        [self.imageV addGestureRecognizer:rotation];
    }
    //旋转手势的方法
    -(void)rotationGes:(UIRotationGestureRecognizer *)rotation
    {
        self.imageV.transform = CGAffineTransformRotate(self.imageV.transform, rotation.rotation);
        [rotation setRotation:0];
    }
    
    • 6.UILongPressGestureRecognizer(长按)
        /*************手势长按*************/
    -(void)longPressGes
    {
        //创建长按手势
        UILongPressGestureRecognizer * longP = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPGes:)];
        //给图片添加长按手势
        [self.imageV addGestureRecognizer:longP];
    }
    //当长按的时候会调用此方法
    -(void)longPGes:(UILongPressGestureRecognizer *)longP
    {
        //判断长按手势的状态.因此,方法应该传入长按手势对象
        if (longP.state == UIGestureRecognizerStateBegan) {
            NSLog(@"开始长按");
        }else if (longP.state == UIGestureRecognizerStateChanged){
            NSLog(@"开始滑动");
        }else if (longP.state == UIGestureRecognizerStateEnded){
            NSLog(@"结束长按");
        }
    }
    
    • 设置是否允许手指触摸,需要设置代理,并实现下面的代理方法
    -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
    {
        //获取当前触摸点的位置
        CGPoint curP = [touch locationInView:self.imageV];
        //设置可触摸的范围(左侧不可触摸,右侧可以触摸)
        if (curP.x <= self.imageV.frame.size.width * 0.5) {
            NSLog(@"%@",NSStringFromCGPoint(curP));
            NSLog(@"不可以触摸");
            return NO;
        }else{
            NSLog(@"%@",NSStringFromCGPoint(curP));
            NSLog(@"可以触摸");
            return YES;
        }
    
    • 设置是否允许接受多个手势,设置对应手势的代理,并实现下面的dialing方法
    //实现代理方法
    //同时执行多个手势操作
    -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
    {
        return YES;
    }
    

    相关文章

      网友评论

          本文标题:手势识别

          本文链接:https://www.haomeiwen.com/subject/dmiusttx.html