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