HitTest的主要目的就是找到对于UIEvent的响应者,本文实现代码是根据apple文档描述的一种猜测实现,帮助大家理解原理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| - (UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event{ //apple文档描述,不接受事件的情况 if (self.userInteractionEnabled == NO || self.isHidden == YES || self.alpha < 0.01) { return nil; } //如果当前View包含此Point if ([self pointInside:point withEvent:event]) { //遍历子View,这里注意要从后往前遍历,因为后面的是越靠近用户的 for (NSInteger i=self.subviews.count-1; i>=0; i--) { UIView* subView = [self.subviews objectAtIndex:i]; //将父View的Point转换成子View坐标系的Point CGPoint pointInSubView = [subView convertPoint:point fromView:self]; //递归子View调用HitTest: UIView* resultView = [subView hitTest:pointInSubView withEvent:event]; //找到了子View可以响应 if (resultView) { return resultView; } } //没有找到可以响应的子View,返回自己 return self; } //返回nil,告诉上一级自己无法响应此事件 return nil; }
|
流程图总结