现在有一个问题,点击黄色子视图超出红色视图的区域的时候,事件没有响应。原因是事件传递默认是在红色父视图的坐标区域里面的,所以超出的部分不起作用。
解决问题的思路:重写红色父视图的- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event方法,当超出区域的适合返回黄色子视图。
@interface UIView2:UIView
@end
@implementation UIView2
@end
@interface UIView1:UIView
@end
@implementation UIView1
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
if (![self pointInside:point withEvent:event]) {
for (UIView *view in self.subviews) {
CGPoint view2Point = [self convertPoint:point toView:view];
if ([view isKindOfClass:[UIView2 class]]&&CGRectContainsPoint(view.frame, view2Point)) {
return view;
}
}
}
return [super hitTest:point withEvent:event];
}
@end
//
UIView1 *view1 = [UIView1 new];
view1.frame = CGRectMake(50, 100, 100, 100);
view1.backgroundColor = [UIColor redColor];
[self.view addSubview:view1];
UIView2 *view2 = [UIView2 new];
view2.frame = CGRectMake(10, 50, 100, 100);
view2.backgroundColor = [UIColor yellowColor];
[view1 addSubview:view2];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap)];
[view2 addGestureRecognizer:tap];
- (void)tap{
NSLog(@"点击了黄色的view");
}
复制代码