UILongPressGestureRecognizer从后面识别视图

时间:2015-04-16 15:14:13

标签: ios objective-c uigesturerecognizer viewcontroller

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

当我通过添加MainViewController的子视图控制器来调用我的CategoryViewController时,如下面的longpress手势动作。

- (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。

1 个答案:

答案 0 :(得分:1)

多次调用您的操作。每次都

  • 手势被识别(触摸特定时间)
  • 手势已经结束(抬起)
  • 手势检测到更改(手指移动)

每次添加视图。

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

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