【问题标题】:Tap Gesture subview touch detect点击手势子视图触摸检测
【发布时间】:2016-09-13 09:41:16
【问题描述】:

我正在创建抽屉

 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;
}

但它总是显示 Touch Outside"

我错过了一些东西,但不知道是什么提前谢谢

还尝试使用 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;
}

【问题讨论】:

    标签: ios objective-c uitapgesturerecognizer


    【解决方案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");
    }
    

    【讨论】:

    • 我试过这不起作用,因为我在 self.view 中添加了手势,所以当我点击抽屉手势委托方法时触发 2 次​​span>
    • 尝试实现delegate的方法: - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 并返回NO;
    • 也尝试实现方法: - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
    • 我用 [self.touchOutSideDrawer setEnabled:NO]; 做到了
    • 但仍有问题
    【解决方案2】:

    我已经通过添加两个手势解决了这个问题

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

    根据@Eugene Zaychenko 的回答,但仍然存在问题,因为委托方法调用了两次

    当触摸抽屉时我不能[self.touchOutSideDrawer setEnabled:NO];,因为之后它会从视图中移除并且如果[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];
    
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多