zoukankan      html  css  js  c++  java
  • 触摸事件与手势识别

    一、触摸事件

      通常使用触摸事件开始时,都是针对单点触摸。如果有移动需求,譬如拖拽控件的位置,此时需要考虑使用手势,而不要使用触摸事件方法。因为:触摸事件的方法中,只有当前的手指点的位置,以及前一个手指点的位置,没有两点间移动的速度。 在开发拖动控件的程序时,通常会考虑在手指离开屏幕时,让控件按照惯性及方向移动一小段距离,或者其他的特效。在绝大多数的开发中,通常在touchesBegan方法中处理用户触摸!   

       以下三种情况是能够接收用户触摸的条件 :

      

      1) self.userInteractionEnabled = YES;  允许接收用户响应  

      2) self.hidden = NO;   只有现实的视图才能接收用户触摸

      3) self.alpha > 0.01;   视图的透明度一定要可见    

      触摸事件的方法

       UIView是UIResponter的子类,可以覆盖下列4个方法处理不同的触摸事件

        1.一根或者多跟手指开始触摸屏幕

      - (void)touchesBegan:(NSSet *)touchesWithEvent:(UIEvent *)event

      2.一根或者多跟手指在屏幕上移动(随着手指的移动,会持续调用该方法)

      - (void)touchesMoved:(NSSet *)touchesWithEvent:(UIEvent *)event

      3.一根或多跟手指离开屏幕

      - (void)touchesEnded:(NSSet *)touchesWithEvent:(UIEvent *)event

      4.触摸结束前,每个系统事件(例如电话呼入)会打断触摸过程

      - (void)touchesCancelled:(NSSet *)touchesWithEvent:(UIEvent *)event

      获取触摸集合中任意一个触摸对象,对于单点触摸,直接用就可以 UITouch *touch = [touches anyObject];

        获取触摸在当前视图的位置 CGPoint location = [touch locationInView:self.view];

        获取触摸在当前视图的前一点位置 CGPoint preLocation = [touch previousLocationInView:self.view];

    二、手势识别

      1. 使用手势识别的步骤  

      (1) 纯手码      

      1> 实例化手势识别     - (id)initWithTarget:(id)target action:(SEL)action;  

      2> 设置手势识别属性,手指的根数,点按的次数等    

      3> 将手势识别附加到指定的视图      addGestureRecognizer    

      4> 编写监听方法

     

      (2) Storyboard  

      1> 直接将手势对象,拖拽到需要监听的控件上   

      2> 连线IBAction,编写监听方法 

      2. 六种手势识别方法解析     

      1> UITapGestureRecognizer——点按手势(离散手势,其他手势都是连续手势)     

       属性:   numberOfTapsRequired——点击次数,单击双击     

           numberOfTouchesRequired——手指根数          

      2> UILongPressGestureRecognizer—— 长按手势(属性不建议修改)         

        3> UIPanGestureRecognizer——拖动手势            

      属性:不常用     

      方法: 在视图中拖动的距离      - (CGPoint)translationInView:(UIView *)view;

      在视图中拖动的速度,通常可用于模拟惯性,需要一些物理方面的计算      - (CGPoint)velocityInView:(UIView *)view;        

      4> UIPinchGestureRecognizer—— 捏合手势          

      属性: scale —— 比例      velocity——捏合速度,不常用        

      5> UIRotationGestureRecognizer——旋转手势      

       属性: rotation——旋转角度      velocity——旋转速度,不常用       

      6> UISwipeGestureRecognizer—— 轻扫手势,通常添加到根视图上        

       属性 : numberOfTouchesRequired—— 参与轻扫手势的手指根数      direction —— 轻扫的方向          

     

      提示:     

      1) 如果要检测几个方向的轻扫,需要分别实例化几个轻扫手势     

      2) 轻扫手势虽然是连续手势,但是不需要去处理UIGestureRecognizerStateChanged状态,因为是在手指离开屏幕后,该手势才被识别。在实际开发中,关于连续性手势的状态判断,需要判断手势的被取消和失败两个状态,在iPad开发中尤为重要!  

      if (UIGestureRecognizerStateCancelled == recognizer.state || UIGestureRecognizerStateFailed == recognizer.state)

      {  

           NSLog(@"手势失败");

      }

    三、手机摇晃监听

     步骤:

      1. 成为第一响应者是监听摇晃事件的关键!在iOS7中可以不指定,但是在iOS6中一定要指定

       - (BOOL)canBecomeFirstResponder  {    

         return YES;

       }  

      2. 在视图出现时,让视图控制器成为第一响应者

      3. 在视图消失时,让视图控制器注销第一响应者身份

      4. 监听摇晃运动事件  

     

      摇晃开始事件

      - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {  

           if (motion == UIEventSubtypeMotionShake)   {    

               NSLog(@"摇晃了");    

      }

      }

  • 相关阅读:
    Android 压力测试工具Monkey
    解决maven的依赖总是无法下载完成
    JDBC连接数据库(二)
    JDBC连接数据库(一)
    webdriver js点击无法点击的元素
    多线程Java面试题总结
    PHP unset销毁变量并释放内存
    ThinkPHP函数详解:D方法
    PHP 函数:intval()
    ThinkPHP 模板显示display和assign的用法
  • 原文地址:https://www.cnblogs.com/swcheng/p/3640641.html
Copyright © 2011-2022 走看看