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

LmyangBK 2015-03-25 09:42:14
如果我给一个父视图添加一个tap手势,然后在给这个父视图添加一个view,接着点击view的时候触发了父视图上的手势。
问题1.当我点击子视图view的时候怎么让它屏蔽掉父视图上的手势?
问题2.解决方式很多种,求一个最优的解决方案。
...全文
493 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bannings 2015-03-25
  • 打赏
  • 举报
回复
我个人倾向于第3种方式,因为耦合程度最低。
Bannings 2015-03-25
  • 打赏
  • 举报
回复
引用 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类似。
LmyangBK 2015-03-25
  • 打赏
  • 举报
回复
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上添加上手势来屏蔽掉父视图上的手势外没想到其他方法了。
xuejuan_wangbao 2015-03-25
  • 打赏
  • 举报
回复
可以用tag区分试一试
Bannings 2015-03-25
  • 打赏
  • 举报
回复
能不能看下你的UI?我的觉得结构可能需要调整
ReyZhang 2015-03-25
  • 打赏
  • 举报
回复
将子视图view的一个交互属性设置上试试
subview.userInteractionEnabled = NO;
LmyangBK 2015-03-25
  • 打赏
  • 举报
回复
嗯,谢谢,学到很多。

29,041

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧