前言
在iOS中,你可以使用系统内置的手势识别(GestureRecognizer),也可以创建自己的手势.GestureRecognizer将低级别的转换为高级别的执行行为,是你绑定到view的对象,当发生手势,绑定到的view对象会响应,它确定这个动作是否对应一个特定的手势(swipe,pinch,pan,rotation).如果它能识别这个手势,那么就会向绑定它的view发送消息,如下图
UIKit框架提供了一些预定义的GestureRecognizer.包含下列手势
- UITapGestureRecognizer敲击手势(单击和双击)
- UIPanGestureRecognizer(拖动手势)
- UIPinchGestureRecognizer(缩放手势)
- UISwipeGestureRecognizer(擦碰手势)
- UIRotationGestureRecognizer(旋转手势)
- UILongPressGestureRecognizer(长按手势)
如果你想让你的应用程序来识别一个独特的手势,如选择目录或纠结的运动,你可以创建自己的自定义GestureRecognizer,将在下篇介绍
将特定的手势和view相关联
每一个特定的手势必须关联到view对象中才会有作用,一个view对象可以关联多个不同的特定手势,但是每一个特定的手势只能与一个view相关联。当用户触摸了view,这个GestureRecognizer就会接受到消息,它可以响应特定的触摸事件。
与特定view关联
- 创建GestureRecognizer实例
- addGestureRecognizer
- 实现处理手势的方法
可以使用removeGestureRecognizer: 来移除手势。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
手势识别状态
Gesture recognizers从一个状态转到另一状态(state)。对于每个状态,根据它们是否符合特定条件来决定时候可以移动到下一个状态。它们分析多点触摸。是否识别失败。未能识别手势意味着state 转换失败。UIGestureRecognizerStateFailed。详见UIGestureRecognizerState枚举
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
为view添加多个手势
当一个view添加多个手势时,在缺省情况下,没有为优先执行哪个手势做排序,每次发生不同。不过你可以覆盖默认的行为(使用类方法、委托方法、和子类化覆盖这些)
- 指定一个Gesture recognizers应该在另一个前捕捉。
requireGestureRecognizerToFail: 这个方法就是在作为参数的Gesture recognizer失败以后接受者才发生,否则从不会发生。
[self.panRecognizer requireGestureRecognizerToFail:self.swipeRecognizer];
- 允许2个手势同时操作
gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
- 禁止在某一点发生Gesture recognizers
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
指定一个单向关系两个手势识别器
想控制两个识别器相互作用,但你需要指定一个单向关系,您可以重写或canPreventGestureRecognizer:或canBePreventedByGestureRecognizer:子类方法。return yes。例如,如果你想要一个旋转的姿态来防止捏动作,但你不想夹手势防止旋转的姿态。例如,你想一个旋转手势阻止一个缩放手势,但你不想一个缩放手势阻止旋转手势,就加入下面代码
[rotationGestureRecognizer canPreventGestureRecognizer:pinchGestureRecognizer];