對于UIView 的兩個(gè)方法的講解:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
網(wǎng)上對這兩個(gè)方法的講解很多哭靖,但是大部分是純文字的描述,我不再贅述侈离,需要可以自己百度“UIView hitTest”等等试幽。
我現(xiàn)在根據(jù)我的理解,把這兩個(gè)方法的源碼實(shí)現(xiàn)模擬出來卦碾。
注意:這里只是模擬铺坞,是為了讓你更容易理解而已,距離真實(shí)的源碼還有很大的差距洲胖,
比如里面的event我根本沒用到济榨。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
UIView *touchView = self;
if ([self pointInside:point withEvent:event]) {
for (UIView *subView in self.subviews) {
//注意,這里有坐標(biāo)轉(zhuǎn)換绿映,將point點(diǎn)轉(zhuǎn)換到subview中擒滑,好好理解下
CGPoint subPoint = CGPointMake(point.x - subView.frame.origin.x,
point.y - subView.frame.origin.y);
UIView *subTouchView = [subView hitTest:subPoint withEvent:event];
if (subTouchView) {
//找到touch事件對應(yīng)的view,停止遍歷
touchView = subTouchView;
break;
}
}
}else{
//此點(diǎn)不在該View中,那么連遍歷也省了橘忱,直接返回nil
touchView = nil;
}
return touchView;
}
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
return CGRectContainsPoint(self.bounds, point);
}