触摸事件与手势识别

一、触摸事件

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

  }

  }

posted @ 2014-03-06 19:51  SWCheng  阅读(322)  评论(0编辑  收藏  举报