将子视图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. |
|
10分 |
虽然我还是不知道你的意图,但是关于这个问题,可以简单说一说。 - (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种方式,因为耦合程度最低。
|
嗯,谢谢,学到很多。
|