- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *view = [super hitTest:point withEvent:event];
if (view == nil) {
// 转换坐标系
CGPoint newPoint = [self.hitButton convertPoint:point fromView:self];
// 判断触摸点是否在button上
if (CGRectContainsPoint(self.hitButton.bounds, newPoint)) {
view = self.hitButton;//hitButton就是我们想点击的控件,让这个控件作为可点击的view返回。
}
}
return view;
}
首先我们要明白一个道理,为什么一个视图超过了父视图的范围的部分被点击的时候没有响应呢,这是iOS事件响应链造成的。因为当一个视图被点击的时候,系统要去寻找是哪个视图被点击了,就会从父视图开始去查找子视图,如果点击事件也在子视图范围内就会去查子视图的子视图,直到这个子视图没有子视图,或者点击事件不在子视图范围内了,就把把这个视图作为第一响应者。
所以我们点击一块位于父视图外的区域,那它本来就不在父视图范围里,那也就不会去检查父视图的子视图了,也就不会把这个子视图作为事件的响应者。
所以我们想要让这块位于父视图外面的区域被点击时也能响应,就需要修改父视图的点击范围,重写- (UIView )hitTest:(CGPoint)point withEvent:(UIEvent )event;方法。
网友评论