2016-05-17 69 views
1

enter image description here叩击手势子视图触摸检测

我创造抽屉

self.isShowMenuVC = NO; 
_menuView = [MenuViewController viewController]; 
[self.menuView setDelegate:self]; 
[self addChildViewController:self.menuView]; 
[self.menuView.view setFrame:CGRectMake(-kMenuTableWidth, 0, kMenuTableWidth, self.view.frame.size.height)]; 
[self.view addSubview:self.menuView.view]; 
[self.menuView didMoveToParentViewController:self]; 

UITapGestureRecognizer *outsideTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(outsideTapped:)]; 
[self.view addGestureRecognizer:outsideTap]; 
outsideTap.delegate = self; 

,当按钮自来水我刚才设置的_menuView.view帧像一个抽屉

我想是来检测触摸外面的抽屉,但我不能这样做

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
if (touch.view == self.menuView.view) { 
    NSLog(@"Touch Drawer"); 
} else { 
    NSLog(@"Touch Outside"); 
} 

return YES; 
} 

但它始终显示触摸外”

我思念的东西,但不知道该怎么感谢事先

与2的姿势也可以尝试,但没有工作,因为在self.view一个手势所以,当我点击抽屉方法调用2次。

对于我试图禁用一个手势,仍然调用两次

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 

if (gestureRecognizer == self.touchInDrawer) { 
    NSLog(@"Touch in drawer"); 
    [self.touchOutSideDrawer setEnabled:NO]; 
} else { 
    NSLog(@"Outside"); 
    [self hideMenuView]; 
} 
return YES; 
} 

回答

0

我有解决这一问题增加了两个手势

@property (strong,nonatomic)  UITapGestureRecognizer   *touchInDrawer; 
@property (strong,nonatomic)  UITapGestureRecognizer   *touchOutSideDrawer; 

按@Eugene Zaychenko的回答:但仍然有问题,因为委托方法调用两次

也我不能[self.touchOutSideDrawer setEnabled:NO];当在抽屉里轻触,因为在接触后t将其从视图中删除,并不会再执行,如果[self.touchOutSideDrawer setEnabled:YES];

但最有趣的是

_touchInDrawer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(outsideTapped:)]; 
[self.menuView.view addGestureRecognizer:self.touchInDrawer]; 
self.touchInDrawer.delegate = self; 

_touchOutSideDrawer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(outsideTapped:)]; 
[self.view addGestureRecognizer:self.touchOutSideDrawer]; 
self.touchOutSideDrawer.delegate = self; 

outsideTapped方法仅调用一次,所以我转移我的所有代码,而正在

- (void) outsideTapped:(UITapGestureRecognizer *)gestureRecognizer { 

if (gestureRecognizer == self.touchOutSideDrawer) { 
    // [self.view removeGestureRecognizer:self.touchOutSideDrawer]; 
    [self hideMenuView]; 
    NSLog(@"Outside"); 

} else { 
    NSLog(@"Touch in drawer"); 

    // [self.touchOutSideDrawer setEnabled:NO]; 

} 

} 
1

的UITapGestureRecognizer不能检测其所属的视图以外的触感。

您需要创建另一个UITapGestureRecognizer并将它们添加到self.menuView.view。

你也可以做两个@property你的手势识别,并检查他们的内部方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
if (gestureRecognizer == self.firstGesture) { 
    NSLog(@"Touch in first gesture"); 
} else { 
    NSLog(@"Touch in another gesture"); 
} 
+0

我试过不工作,因为我在self.view中添加了手势,所以当我点击抽屉手势委托方法触发2次 –

+0

尝试实现委托的方法: - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeShultaneouslyWithGestureRecognizer :(UIGestureRecognizer *)otherGestureRecognizer 并且仅仅返回NO; –

+0

也尝试实施方法: - (BOOL)gestureRecognizerShouldBegin :(UIGestureRecognizer *)gestureRecognizer –