iOS响应链原理

时间:2022-12-02 17:48:31

ios找到被点击的view的过程是从根view开始递归地调用hitTest方法,直到有一个子view的hitTest方法返回自身;如果所有一级子view的hitTest方法都返回nil,那么根view就返回自己。

应用hitTest方法,hitTest方法的作用是返回被点击的view,只返回一个。

每个view都会有hitTest方法,hitTest方法里面会去调用pointInside方法来判断点击的点是否在自己的view范围内,hitTest返回自身view的条件是自身的hitTest方法被调用,自己的pointInside方法返回true,没有子view或者所有子view的hitTest方法返回nil。(另一种理解方法是点击的点在父view的范围内,父view才有可能会去调用子view的hitTest方法,这里说有可能的原因是 如果父view的userInteractionEnabled  == NO 时,父view的hitTest方法会直接返回nil, 子view的hitTest方法也不会被调用)

hitTest方法大致的内容

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

//一些判断条件,比如userInteractionEnabled == NO 时直接返回nil

if([self pointInside:point withEvent:event]) {

for(UIView *subView in self.subViews) {

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

if(hitView) {

return hitView;

}

}

return self;

}

return nil;

}