作用:尋找最適合的View
參數(shù):當(dāng)前手指所在的點(diǎn).產(chǎn)生的事件
返回值:返回誰(shuí),誰(shuí)就是最適合的View.
什么時(shí)候用調(diào)用:只要一個(gè)事件,傳遞給一個(gè)控件時(shí),就會(huì)調(diào)用這個(gè)控件的hitTest方法
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
作用:判斷point在不在方法調(diào)用者上
point:必須是方法調(diào)用者的坐標(biāo)系
什么時(shí)候調(diào)用:hitTest方法底層會(huì)調(diào)用這個(gè)方法,判斷點(diǎn)在不在控件上.
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
return YES;
}
hitTest底層實(shí)現(xiàn):
1.判斷當(dāng)前能不能接收事件
if(self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01)
returnnil;
2.判斷觸摸點(diǎn)在不在當(dāng)前的控件上
if(![self pointInside:point withEvent:event]) return nil;
3.從后往前遍歷自己的子控件
int count = (int)self.subviews.count;
for (int i = count - 1; i >= 0;i-- ) {
UIView *childV = self.subviews[i];
把當(dāng)前坐標(biāo)系上的點(diǎn)轉(zhuǎn)換成子控件坐標(biāo)系上的點(diǎn).
CGPoint childP =[self convertPoint:point toView:childV];
判斷自己的子控件是不是最適合的View
UIView *fitView =[childV hitTest:childP withEvent:event];
如果子控件是最適拿的View,直接返回
if (fitView) {
returnfitView;
}
}
4.自己就是最適合的View
return self.