UIEvent
:当用户触摸屏幕时,UIKit
会将这一操做封装成一个个的UIEvent
对象,该对象包含着一些处理事件所须要的信息UIKit
中,全部直接或者间接继承UIResponder
类的都具备响应事件的能力(例如:UIApplication
、UIView
、UIViewController
和咱们自定义的视图以及视图控制器),这些对象一般都被称为响应对象(也称为响应者,hit-testview)当用户触摸屏幕时会产生若干个UIEvent
对象,UIKit
会把UIEvent
对象放到事件队列中,当须要处理事件的时候,UIApplication
会从事件队列头部取出一个UIEvent
对象进行分发,找到能够处理该事件的响应者git
当手指触摸屏幕的时候,UIApplication经过从事件队列头中取出一个事件对象分发给UIWindow,
而后每个视图经过调用hitTest:withEvent和pointInside:withEvent方法,
如pointInside:withEvent方法返回YES,则继续遍历该视图上的全部子视图,
直到找到最终响应视图,而后hitTest:withEvent方法逐级返回最终响应视图,
找到最终响应视图以后则会尝试让其处理这个事件,若是没法处理该事件,
则事件会被传递给下一个事件处理者,直到传递到AppDelegate,则事件会被丢弃。
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
/**当知足如下条件,返回视图层级中能响应触控点的最佳视图
self.hidden == NO;
self.userInteractionEnabled = YES;
self.alpha > 0.01;事件的触摸点在视图的bounds内
*/复制代码
当我给pupleView
重写了touchsBegan:withEvent、touchsEnded:withEvent、
touchsMoved:withEvent、touchsCancelled:withEvent
方法,而且给pupleView
添加了UIGestureRecognizer
并点击,控制台打印的结果以下:
github
控制台打印的结果以下:
XLPupleView touchesBegan
XLPupleView touchesMoved
handle Tap复制代码
说明:在识别一个触摸事件的时候,若是该视图有添加手势识别器,则手势识别器拥有更高优先级,优先处理事件。
其会先调用touchsBegan:withEvent、touchsMoved:withEvent方法和手势识别器对应响应方法,只有手势
识别失败了,才会触发响应链中的touchsEnded:withEvent方法,若是识别成功,则会触发touchsCancelled:withEvent
取消响应者链对触摸事件的响应。
也能够设置手势识别器中的cancelsTouchesInView属性,该属性默认为YES。
当设置为NO时,手势识别器识别到触摸事件以后不会发送touchesCancelled:withEvent取消响应链对触摸事件的响应,
这个时候手势识别器和hit-testview均响应触摸事件。复制代码
Demo下载地址:github.com/hlc0000/Res…bash
今天就总结到这里了,但愿各位小伙伴多多提出宝贵意见,交流学习~
ide