事件传递与视图响应链

2021-08-31  本文已影响0人  核桃_ad0a

事件传递

在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被抛弃掉

上一篇下一篇

猜你喜欢

热点阅读