2.2手势识别的状态和手势识别器幕后原理
(一)手势的状态
// 手势状态
typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
UIGestureRecognizerStatePossible, // 尚未识别是何种手势操作(但可能已经触发了触摸事件),默认状态
UIGestureRecognizerStateBegan, // 手势已经开始,此时已经被识别,但是这个过程中可能发生变化,手势操作尚未完成
UIGestureRecognizerStateChanged, // 手势状态发生转变
UIGestureRecognizerStateEnded, // 手势识别操作完成(此时已经松开手指)
UIGestureRecognizerStateCancelled, // 手势被取消,恢复到Possible状态
UIGestureRecognizerStateFailed, // 手势识别失败,恢复到Possible状态
UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // 手势识别完成,同UIGestureRecognizerStateEnded
};
(二)离散型手势识别器和连续型手势识别器之间的对比:
调用回调方法区别:
状态之间切换区别:
总结:离散型手势一旦识别就无法取消,而且只会调用一次手势操作事件(初始化手势时指定的回调方法)。而连续型手势会多次调用手势操作事件,而且在连续手势识别后可以取消手势.两者调用回调方法的次数是不同的.
(三)手势识别器幕后原理
手势识别器是在正常的响应者链条
之上.默认情况下,UIWindow首先将触摸事件发送给手势识别器,只有手势识别器无法处理触摸事件时,事件才会被转发给响应者链条
.
应用程序判断手势是否别识别的过程:
手势识别器进入UIGestureRecognizerStatePossible
状态:
离散型手势:
1>手势识别器将判断手势处于`UIGestureRecognizerStateRecognized`
还是`UIGestureRecognizerStateFailed`状态.
2>如果是`UIGestureRecognizerStateRecognized`状态,手势识别器将处理事件,
并调用指定的回调方法.
如果是`UIGestureRecognizerStateFailed`状态,手识别器将把触摸事件装发
给`响应者链条`.
连续型手势:
1>手势识别器将判断手势处于`UIGestureRecognizerStateBegan`
还是`UIGestureRecognizerStateFailed`状态.
2>如果手势处于UIGestureRecognizerStateBegan状态,手势识别器将处理事件,并
调用回调方法.然后当手势发生变化时,都将进入`UIGestureRecognizerStateChanged`
状态,并调用指定的回调方法.这个过程不断重复,直到触摸结束并进入`UIGestureRecognizerStateEnded`
状态.如果触摸方式不再符合预期手势,将进入`UIGestureRecognizerStateCancelled`
状态.
如果手势处于`UIGestureRecognizerStateFailed`状态,手势识别器将把触摸事件装发
给`响应者链条`.
经验谈:
手势从状态
UIGestureRecognizerStatePossible
变化到状态UIGestureRecognizerStateFailed
所需的事件可能很长.如果手势识别器处理触摸事件的速度慢的莫名其妙,最好在手势处理方法中输出相关的状态,这样就可以清楚地知道手势状态的变换情况,就可以确定延迟出现在什么地方.