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才有可能会去调用子viewhitTest方法,这里说有可能的原因是 如果父viewuserInteractionEnabled  == NO 时,父view的hitTest方法会直接返回nil, 子viewhitTest方法也不会被调用)

 

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;

}

posted on 2017-07-16 12:30  ximenchuixie  阅读(548)  评论(0编辑  收藏  举报