场景:橙色view添加在蓝色view上,满足点击超出蓝色view部分可以响应事件
实现思路:
重写底部蓝色view的hitTest方法,从最上层依次遍历子控件,判断触摸点是否在子控件上,在的话就返回子控件的hitTest方法,不在就返回self
完整代码:
#import "ViewController.h"
#import "BotView.h"
@interface ViewController ()
@property(strong, nonatomic) BotView *botView;
@property(strong, nonatomic) UIView *topView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
// Do any additional setup after loading the view.
self.botView = [BotView new];
self.topView = [UIView new];
[self.view addSubview:self.botView];
[self.botView addSubview:self.topView];
self.botView.frame = CGRectMake(100, 100, 100, 100);
self.topView.frame = CGRectMake(0, 0, 50, 200);
self.botView.backgroundColor = [UIColor linkColor];
self.topView.backgroundColor = [UIColor orangeColor];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(topViewClick:)];
[self.topView addGestureRecognizer:tap];
}
- (void)topViewClick:(UITapGestureRecognizer *)tap {
NSLog(@"点击了顶部view");
}
@end
botView代码:
#import "BotView.h"
@implementation BotView
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
int count = (int)self.subviews.count;
for (int i=count-1; i>=0; i--) {
UIView *subView = self.subviews[i];
//点击事件作用在子控件上面,返回点击点
CGPoint isPoint = [self convertPoint:point toView:subView];
UIView *subv = [subView hitTest:isPoint withEvent:event];
if (subv) {
return subv;
}
}
return self;
}
@end