有时需要让子视图的位置超出父视图,这时子视图不会响应点击事件,在父视图中实现这个方法,可以让子视图超出的部分也响应点击事件
父视图需要是view的子类
这个方法可以判断出自己的子视图,和子视图的子视图,在多层的话需要继续遍历
//让超出自己视图范围的子视图响应事件
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
//没有剪裁子视图 没有隐藏 透明度大于0.0
if(!self.clipsToBounds && !self.hidden && self.alpha > 0.0){
//遍历子视图
for (UIView *member in self.subviews){
//将相对于自己的点坐标转化为相对于子视图的点坐标
CGPoint subPoint = [member convertPoint:point fromView:self];
//返回响应的view
UIView *result = [member hitTest:subPoint withEvent:event];
if(result != nil){
return result;
}else{
//遍历下一级子视图
if(!member.clipsToBounds && !member.hidden && member.alpha > 0.0){
for (UIView *member1 in member.subviews){
CGPoint subPoint1 = [member1 convertPoint:subPoint fromView:member];
UIView *result1 = [member hitTest:subPoint1 withEvent:event];
if(result1 != nil){
return result1;
}
}
}
}
}
}
return nil;
}