在维护老项目开发过程中,子视图调用了

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    [super touchesBegan:touches withEvent:event];

发现点击子视图没有进入这个方法。

严谨的查了下父视图,发现父视图调用了

  _tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onTapGesutre:)];
    _tapGesture.delegate = self;
    [self.view addGestureRecognizer:_tapGesture];

基本上可以判断,手势已经触发,touch就不会触发。说白了就是手势响应优先级大于传递链,手势响应成功后,就取消了事件响应链传递。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
    if ([NSStringFromClass([touch.view class]) isEqualToString:@"子视图名称"]) {
        return NO;
    return  YES;

手势添加这个代码,来判断触发的是哪个视图,touch.view是子视图的,return NO就可以解决冲突。tip:这里也可以打个断点来看下touch.view是什么。

分类:
iOS
标签: