LongPressGestureRecognizer 从视图背后识别

LongPressGestureRecognizer recognize from behind the views

我已将 MainViewController 和 LongPressGestureRecognizer 添加到 MainViewController 的视图中。

当我通过如下所示添加为 MainViewController 的子视图控制器来调用我的 CategoryViewController 时,作为长按手势操作。

- (IBAction)longPressClicked:(id)sender {
    _categoryVC = [[CategoryViewController alloc] initWithNibName:@"CategoryViewController" bundle:nil];
    _categoryVC.view.frame = self.view.frame;
    [self addChildViewController:_categoryVC];
    [_categoryVC didMoveToParentViewController:self];

}

我第一次点击长按屏幕它将 CategoryViewController 加载到子控制器并推到顶部,这很好,但我再次做同样的事情并且再次调用 longPressClicked 方法。

我想知道为什么它会这样做,因为 CategoryViewController 在视图的顶部并且它启用了 UserInteractionEnabled。

您的操作被多次调用。每当

  • 手势被识别(按下特定时间)
  • 手势结束(抬起)
  • 手势检测到变化(手指移动)

并且每次添加一个视图。

因此,当您触地时,您会添加一个视图,而当您抬起时,您会再次添加一个视图。除了你的手势识别器 不会取消 触摸跟踪只是因为你在触摸位置上方添加了一个视图。它仍然处理触摸。为防止这种情况,只需考虑您的手势状态如下

- (IBAction)longPressClicked:(id)sender {
    UILongPressGestureRecognizer *gesture = (UILongPressGestureRecognizer *)sender;

     if (gesture.state == UIGestureRecognizerStateBegan) {
        // add your view
     }
}

另一种选择是保留对视图的弱引用并检查视图是否为零。如果是这样,请创建一个新视图并将其添加到视图控制器的子视图中。

@interface ViewController ()
@property (weak, nonatomic) UIView *myView;
@end

- (void)longPressClicked:(id)sender {
    if (!self.myView) {
      // create view
      self.myView = [[UIView alloc] init....]; 
    }
}