zoukankan      html  css  js  c++  java
  • 【iOS系列】-触摸事件与手势识别

    【iOS系列】-触摸事件与手势识别

    第一:触摸事件

    一根手指触摸屏幕时,会创建一个与手指相关联的UITouch对象

    UIEvent:称为事件对象,记录事件产生的时刻和类型

    两根手指同时触摸一个view,那么view只会调用一次touchesBegan:withEvent:方法,touches参数中装着2个UITouch对象;两根手指一前一后分开触摸同一个view,那么view会分别调用2次touchesBegan:withEvent:方法,并且每次调用时的touches参数中只包含一个UITouch对象;所以可以根据touches中UITouch的个数可以判断出是单点触摸还是多点触摸

    我们可以touch时间来监听view的点击


    属性

    • (CGPoint)locationInView:(UIView *)view;
      返回值表示触摸在view上的位置
      这里返回的位置是针对view的坐标系的(以view的左上角为原点(0, 0))

    • (CGPoint)previousLocationInView:(UIView *)view;
      该方法记录了前一个触摸点的位置


    常用方法:

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    
    -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
    
    -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    
    -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
    
    
    //注 由于touches是NSSet,无须集合,因此我们可以利用下面的方法来获得UITouch对象以及相关触摸的位置坐标  
    UITouch *touch = [touches anyObject];
    //当前触摸点
    CGPoint current = [touch locationInView:self];
    //上一个触摸点
    CGPoint previous = [touch previousLocationInView:self];
    

    UIView不接收触摸事件的三种情况

    1,userInteractionEnabled = NO

    2,hidden = YES

    3,alpha = 0.0 ~ 0.01

    注:UIImageView的userInteractionEnabled默认就是NO.


    第二:手势识别器:UIGestureRecognizer

    UIGestureRecognizer,能轻识别用户在某个view上面做的一些常见手势,但是UIGestureRecognizer是一个抽象类,使用它的子类才能处理具体的手势

    //常见子类
    UITapGestureRecognizer(敲击)
    UIPinchGestureRecognizer(捏合,用于缩放)
    UIPanGestureRecognizer(拖拽)
    UISwipeGestureRecognizer(轻扫)
    UIRotationGestureRecognizer(旋转)
    UILongPressGestureRecognizer(长按)
    

    手势识别器的相关状态

    UIGestureRecognizerStateBegan,// 一个手势已经开始但尚未改变或者完成时
    UIGestureRecognizerStateChanged,// 手势状态改变
    UIGestureRecognizerStateEnded,// 手势完成
    

    使用

    UIGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapView)];
    tap.delegate = self;//不设置代理也可以监听/执行监听方法,但是默认是不能进行多手势识别,或者我们想实现代理方法的时候,就要设置代理
    [self.iconView addGestureRecognizer:tap];
    

    //手势进行缩放的注意点:

    UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchView:)];
    pinch.delegate = self;
    [self.iconView addGestureRecognizer:pinch];
    
    - (void)pinchView:(UIPinchGestureRecognizer *)pinch
    {
        pinch.view.transform = CGAffineTransformScale(pinch.view.transform, pinch.scale, pinch.scale);
        pinch.scale = 1; // 由于每次进行缩放的时候都是相对于初始位置,因此我们每次缩放后把缩放比设为1,也就是让下一次缩放相对于想在的位置
    }
    

    //手势进行旋转的注意点:

    UIRotationGestureRecognizer *recognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotateView:)];
    recognizer.delegate = self;
    [self.iconView addGestureRecognizer:recognizer];
    
     - (void)rotateView:(UIRotationGestureRecognizer *)rotate
    {	    
        rotate.view.transform = CGAffineTransformRotate(rotate.view.transform, rotate.rotation);
        recognizer.rotation = 0; //由于每次进行旋转的时候都是相对于初始位置,因此我们每次缩放后把旋转角度比设为0,也就是让下一次缩放相对于想在的位置
    }
    

    //拖拽,移动

    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panView:)];
    [self.purpleView addGestureRecognizer:pan];
    
    - (void)panView:(UIPanGestureRecognizer *)pan
    {
    // 1.在view上面挪动的距离
    CGPoint translation = [pan translationInView:pan.view];
    CGPoint center = pan.view.center;
    center.x += translation.x;
    center.y += translation.y;
    pan.view.center = center;
    
    // 2.清空移动的距离
    [pan setTranslation:CGPointZero inView:pan.view];//同上,每次移动后我们要进行清零操作
    }
  • 相关阅读:
    最小生成树问题-prim算法求解
    排序算法7---快速排序算法
    IOS工作笔记(九)
    NSUserDefaults的一些用法
    UIActionSheet的简单使用
    如何处理过多使用懒加载的问题?
    prefix.pch文件的一些简单使用
    IOS工作笔记(八)
    登录时本地保存账号密码及关闭ARC的方法
    IOS页面跳转的方法
  • 原文地址:https://www.cnblogs.com/fengtengfei/p/4440452.html
Copyright © 2011-2022 走看看