值得参考的链接
当前屏幕有一个用户事件时,系统会产生一个事件,交给当前应用的事件处理队列。
寻找能处理事件的View
视图会调用hitTest:withEvent:
判断自己能不能处理这个事件。
不能处理的3种情况:
1.不允许交互:userInteractionEnabled = NO
2.隐藏:如果把父控件隐藏,那么子控件也会隐藏,隐藏的控件不能接受事件
3.透明度:如果设置一个控件的透明度<0.01,会直接影响子控件的透明度。alpha:0.0~0.01为透明。
能处理的情况:
父视图会调用子视图hitTest:withEvent:
,就算事件点不在视图本身,且不会想上面3种情况下,是能处理这个事件的。并调用point(inside:with:)
判断点是否在自己View上。
子视图调用hitTest:withEvent:
顺序:
从最外层开始调用hitTest:withEvent:
,如果找到了,不会再遍历本视图的hitTest:withEvent:
。
处理事件
调用touch
方法,如果自身能处理,则响应事件不会继续往下传递。如果touch、中调用了
super,上一个响应者会调用
touch`。
如果当前这个view是控制器的view,那么控制器就是上一个响应者
如果当前这个view不是控制器的view,那么父控件就是上一个响应者
网友评论