UIPinchGestureRecognizer 触发两次

UIPinchGestureRecognizer is firing twice

我正在将 UIPinchGestureRecognizer 添加到显示图像的 scrollView。 紧要关头,我提出一个新观点。

var pinch = UIPinchGestureRecognizer(target: self, action: "showFullScreen:")
self.scrollView.addGestureRecognizer(pinch)

showFullScreen函数:

func showFullScreen(sender:UITapGestureRecognizer) {     
    presentViewController(photoBro, animated: true, completion: nil)
}

但是当我捏住 scrollView 时,showFullScreen 被调用了两次,因此出现了以下错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present modally an active controller

我正在寻找解决方案,他们建议删除 pinchGesture,但我想保留 gestureRecognizer,以便用户仍然可以捏合进入全屏。

我该怎么做才能确保 showFullScreen 只被调用一次?

试试这个:

  func showFullScreen(sender:UITapGestureRecognizer) {     
     if(sender.state == UIGestureRecognizerState.Ended) {
         presentViewController(photoBro, animated: true, completion: nil)
     }    
  }

与离散的 UITapGestureRecognizerUISwipeGestureRecognizer 不同,UIPinchGestureRecognizer 是连续的。

这意味着点击和滑动识别器将在完成后发送一条消息,但捏合(和平移)识别器将随着手势的进行不断发送消息,以允许您使用识别器创建交互。

正如建议的那样,您可以检查识别器状态以在控制器结束时显示它,您还可以添加一个标志以确保演示文稿不会被调用两次。这会给你更多的灵活性,比如只有在捏合达到一定距离时才显示控制器。

如果您未指定要收听的状态,只需通过手势调用选择器即可触发以下列表中的 any/every 状态。

所以尝试对这些状态中的任何一个使用

typedef enum {
   UIGestureRecognizerState.Possible,
   UIGestureRecognizerState.Began,
   UIGestureRecognizerState.Changed,
   UIGestureRecognizerState.Ended,
   UIGestureRecognizerState.Cancelled,
   UIGestureRecognizerState.Failed,
   UIGestureRecognizerState.Recognized = UIGestureRecognizerState.Ended
} UIGestureRecognizerState;

对于 statedBegan 和 stateEnded 状态,您的代码是 运行 两次

func showFullScreen(sender:UITapGestureRecognizer) {     
         if (sender.state == UIGestureRecognizerState.Began) {

    }
    if (sender.state == UIGestureRecognizerState.Ended) {
       //your dismiss code here
    }