探究Objective-C-之响应者链与手势处理器
UIResponder传递路径
UIViewController和UIView都继承了UIResponder,因此他们及其子类都可以作为事件的响应者。事件响应者链的处理次序是: First Responder(用户触摸的view控件本身) -> First Responder的viewcontroller(如果有)-> 父View(如果有)->父View的viewcontroller(如果有)… ->UIWindow-> UIApplication->应用程序委托对象。(沿着nextResponder一路向上)
如果都没有处理,那么该事件被丢弃。如果某个响应者“截获”了某个事件,那么该响应者要依据条件决定是否处理该事件。当响应者无法处理该事件时,则需要再处理方法中手动传递该事件。如
|
|
UIResponder触碰响应方法
|
|
可以通过重写UIResponder的如上四个方法来管理触碰的响应操作:
|
|
系统手势处理器(UIGestureRecognizer)
包括:
- UITapGestureRecognizer 点击
- UIPinchGestureRecognizer 捏合
- UIRotationGestureRecognizer 旋转
- UISwipGestureRecognizer 划动
- UIPanGestureRecognizer 拖动
- UILongPressGestureRecognizer 长按
使用步骤:
- 设置要添加手势控件如view的
userInteractionEnabled = YES;multipleTouchEnabled = YES;
属性; - 给gestureRecognizer 添加target: action:,供发生手势时触发;
- 使用[view addGestureRecoginzer:]完成添加。
每个UIGestureRecoginzer包含如下属性和方法:
|
|
此外, 各个处理还分别提供额外的属性来处理各自手势:
手势处理器 | 属性及说明 |
---|---|
UIPinchGestureRecognizer | velocity 捏合的速度;scale 捏合的比例|
|UIRotationGestureRecogizer| rotation 旋转角度;velocity 速度|
|UISwipGestureRecognizer| direction 划动方向,如UISwipeGestureRecognizerDirectionRight/Left/Up/Down;numberOfTouchesRequired 指定只处理几个手指的触碰事件|
|UILongPressGestureRecognizer | minimumPressDuration 至少按的秒数;numberOfTouchesRequired 指定只处理几个手指的触碰事件;allowableMovement 允许移动手指的最大距离,超过则手势失效|
手势冲突
可以给每个UIGestureRecognizer设置一个实现UIGestureRecognizerDelegate的值,其包括了如下几个方法:
|
|
自定义手势
- 继承自UIGestureRecognizer, 在实现文件添加#import
头文件的引用 - 维护两种状态转变方式:
|
|
为此,根据需要,重载在UIGestureRecognizerSubclass.h所声明的方法,在方法中设置好self.state = UIGestureRecognizerStateCancelled;和 self.state = UIGestureRecognizerSateEnded 的值:
|
|