我将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....];
    }
}

关于ios - UILongPressGestureRecognizer从 View 后面识别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29678999/

10-13 08:08
查看更多