应用接收到touch事件,会按照事件响应链的顺序执行hitTest方法去获取touch对应的视图。
UIApplication->UIWindow->UIView->UIView(subviews)
在UIView->UIView(subviews)遍历的这一步,遍历顺序是从顶层到底层,也就是反向遍历UIView的subviews数组,直到找到目标视图。这样在平级视图叠加的时候就保证了先响应更靠顶层的视图touch事件。
如果要扩大一个视图的响应范围,比如一个frame为{100,100,10,10}的button,在点击其周边20范围内的时候,仍然能响应button的事件,有一个比较简单的方法就是重写该button的方法
<pre>
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
CGRect bounds = self.bounds;
CGRect abc = CGRectMake(-50, -50, bounds.size.width+100, bounds.size.height+100);
return CGRectContainsPoint(abc, point);
}
</pre>
问题:为什么在hitTest中打印视图信息,执行了两遍???
打印了一下调用栈,发现两次打印的时候栈信息有部分差别,但也没看出原因。搜到苹果的一封邮件回复,说这是正常现象,因为在两次hitTest调用期间,系统修改了一下point。
it’s normal. The system may tweak the point being hit tested between the calls. Since hitTest should be a pure function with no side-effects, this should be fine.
更深入的就查不到了。