Response Chain

89 阅读1分钟

yizibi.github.io/2019/07/26/…

func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView?

The view object that is the farthest descendent of the current view and contains point. Returns nil if the point lies completely outside the receiver’s view hierarchy.

blog.danthought.com/programming…

segmentfault.com/a/119000001…

www.jianshu.com/p/f55b613b5…

当事件到来时,会通过hitTest和pointInside两个方法,从Window开始向上面的视图查找,找到第一响应者的视图。找到第一响应者后,系统会判断其是继承自UIControl还是UIResponder,如果是继承自UIControl,则直接通过UIApplication直接向其派发消息,并且不再向响应者链派发消息。

如果是继承自UIResponder的类,则调用第一响应者的touchesBegin,并且不会立即执行touchesEnded,而是调用之后顺着响应者链向后查找。如果在查找过程中,发现响应者链中有的视图添加了手势,则进入手势的代理方法中,如果代理方法返回可以响应这个事件,则将第一响应者的事件取消,并调用其touchesCanceled方法,然后由手势来响应事件。

如果手势不能处理事件,则交给第一响应者来处理。如果第一响应者也不能响应事件,则顺着响应者链继续向后查找,直到找到能够处理事件的UIResponder对象。如果找到UIApplication还没有对象响应事件的话,则将这次事件丢弃。

事件穿透

www.jianshu.com/p/1ce4c0a7a…

2.视图覆盖 但是不想要响应上层视图view事件

  • (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event{

UIView *hitView = [super hitTest:point withEvent:event];

if(hitView == 不想要响应视图的view){

return nil; // 此处返回空即不相应任何事件

}

return hitView;

}

截屏2021-10-21 下午8.11.47.png

juejin.cn/post/684490…