事件传递与视图响应链
事件传递
在Application将事件分发到主窗口后就会向下查找最合适处理该事件的视图
Application事件队列->程序主窗口->向下查找最合适处理事件的View
事件是如何找到最合适处理该事件的视图的呢?
- (UIView*)hitTest:(CGPoint)pointwithEvent:(UIEvent*)event
函数是返回响应改事件的视图,如果返回不为空择该视图可以处理该事件,相反返回空则不处理该事件
- (BOOL)pointInside:(CGPoint)pointwithEvent:(UIEvent*)event
函数返回产生事件的坐标是否在该视图坐标系中,返回YES,则代表产生事件的点在该视图坐标系上,说明该视图可以处理该事件;返回NO,代表事件的点不在该视图坐标系中,说明该视图不能处理该事件
事件被分发到程序主窗口也就是UIWindow上后,会调用
- (UIView*)hitTest:(CGPoint)pointwithEvent:(UIEvent*)event
- (BOOL)pointInside:(CGPoint)pointwithEvent:(UIEvent*)event
两个函数来确定当前视图能不能处理该事件,当两个函数满足条件(即hitTest函数返回不为空,potinside返回YES)时,事件会向子视图传递,直到子视图没有符合条件的视图,就认为自己是最合适处理该事件的视图。
调用顺序是倒叙子视图倒序递归调用
视图不能接受触摸事件有以下几种情况
1.不允许交互
2.设置隐藏,父视图设置了隐藏,或者当前视图设置了隐藏
3.透明度为0~0.01时,不能接收事件
视图响应链
首先要理解:响应者对象(UIResponse)
在iOS中只有继承UIResPonse的对象才能接受并处理事件,我么称其为响应者对象
找到事件的最佳响应者后会调用touchesBegin、touchesMoved、touchesEnded等方法。touch方法默认会将事件沿着响应链向下传递(touch方法默认不处理事件,只传递事件),事件传递给下一个响应者处理,也就是事件会沿着响应者链传递,直到被处理或者传递到UIApplication被抛弃掉