Code Bye

怎么让子视图不触发添加到父视图上的tap手势?

如果我给一个父视图添加一个tap手势,然后在给这个父视图添加一个view,接着点击view的时候触发了父视图上的手势。
问题1.当我点击子视图view的时候怎么让它屏蔽掉父视图上的手势?
问题2.解决方式很多种,求一个最优的解决方案

将子视图view的一个交互属性设置上试试
subview.userInteractionEnabled = NO;
能不能看下你的UI?我的觉得结构可能需要调整
可以用tag区分试一试
    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0,200, 400)];
    v.backgroundColor = [UIColor redColor];
    v.userInteractionEnabled = NO;
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    btn.frame = CGRectMake(0, 0, 100, 50);
    [btn addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
    btn.backgroundColor = [UIColor blackColor];
    [v addSubview:btn];
    
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
    [tap addTarget:self action:@selector(tapAction)];
    [self.view addGestureRecognizer:tap];
    [self.view addSubview:v];

以上视图的层次结构是非常简单的,就是一个父视图self.view和子视图v. 
我现在除了想到一种方法。就是在子视图v上添加上手势来屏蔽掉父视图上的手势外没想到其他方法了。


10分
引用 4 楼 LmyangBK 的回复:

    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0,200, 400)];
    v.backgroundColor = [UIColor redColor];
    v.userInteractionEnabled = NO;
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    btn.frame = CGRectMake(0, 0, 100, 50);
    [btn addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
    btn.backgroundColor = [UIColor blackColor];
    [v addSubview:btn];
    
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
    [tap addTarget:self action:@selector(tapAction)];
    [self.view addGestureRecognizer:tap];
    [self.view addSubview:v];

以上视图的层次结构是非常简单的,就是一个父视图self.view和子视图v. 
我现在除了想到一种方法。就是在子视图v上添加上手势来屏蔽掉父视图上的手势外没想到其他方法了。

虽然我还是不知道你的意图,但是关于这个问题,可以简单说一说。
1. 如果你一定要用一个Button、一个TapGesture的方式来组织的话,你的Button实际上是触发不了的,这种情况下,你只能在TapGesture的触发方法里判断:

- (IBAction)tapAction:(UITapGestureRecognizer *)gesture {
    if (CGRectContainsPoint(self.btn.frame, [gesture locationInView:self.btn])) {
        NSLog(@"btn clicked.");
    } else {
        NSLog(@"tap clicked.");
    }
}

判断点击是不是发生在Button里。

2. 放弃使用Button,用一个TapGesture来代替,这种情况下,你就有两个TapGesture了,你把self.view上的TapGesture的requireGestureRecognizerToFail:方法设置为小范围的那个Gesture,这么一来,只有当小的Gesture没有触发的情况下,大的Gesture才会被触发。

3. Button保留,self.view上的Gesture放弃,在loadView方法里,把self.view覆盖成UIControl的实例(或者在Xib里把view的Class改为UIControl),这么一来,self.view是可以直接支持点击方法的,与Button类似。


10分
我个人倾向于第3种方式,因为耦合程度最低。
嗯,谢谢,学到很多。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明怎么让子视图不触发添加到父视图上的tap手势?