让超出自己视图范围的子视图响应事件

有时需要让子视图的位置超出父视图,这时子视图不会响应点击事件,在父视图中实现这个方法,可以让子视图超出的部分也响应点击事件
父视图需要是view的子类
这个方法可以判断出自己的子视图,和子视图的子视图,在多层的话需要继续遍历

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
//让超出自己视图范围的子视图响应事件
- (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;
}
文章目录
|