hitTest方法与PointInside方法

04-hitTest方法与PointInside方法

hitTest方法

作用:寻找最适合的View
参数:当前所指所在的点产生的事件
返回值:返回谁, 谁就是最适合的View. 
什么时候调用:只要这个事件,传递给子个控件时, 就会调用这个控件的hitTest方法 
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

PointInside方法

作用:判断point在不在方法调用者上
point:必须是方法调用者的坐标系 
什么时候调用:hitTest方法底层会调用这个方法,判断点在不在控件上. 
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
return YES; 
}

hitTest方法底层实现

作用:当一个事件传递给当前View的时候就会调用这个方法. 
当前手指在屏幕上的点
当前产生的事件
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
1.查看自己能不能接收事件
if(self.userInteractionEnabled == NO || self.hidden == YES ||self.alpha <= 0.01){
return nil; 
}
2.判断当前的点在不在自己身上.
if(![self pointInside:point withEvent:event]){
    return nil; 
}
    //查看自己是不是最适合的view 
    //从后往前遍历自己的子控制器.
int count = (int)self.subviews.count; 
for(inti = count -1; i >=0; i--) {
    //取出子控制器.
UIView *childView = self.subviews[i];
    //要把当前的点转换成子控件上的坐标点. 
CGPoint childP= [selfconvertPoint:point toView:childView];
UIView *view = [childView hitTest:childP withEvent:event]; 
    //如果有值,直接返回,返回的就是最适合的View.
if (view) { 
    return view;    
    } }
    //没有找到比自己更适合的View.自己就是最适合的View 
return self;
}
原文地址:https://www.cnblogs.com/zhoudaquan/p/5037413.html