引用 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类似。