UIPinchGestureRecognizer发射两次

时间:2015-05-20 17:48:27

标签: ios swift uipinchgesturerecognizer

我将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会被调用两次,因为它会出现以下错误:

  

由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:'应用程序尝试以模态方式呈现活动控制器

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

我可以做些什么来确保只为一次捏合调用showFullScreen一次?

3 个答案:

答案 0 :(得分:3)

试试这个:

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

答案 1 :(得分:1)

如果您没有指定要收听的状态,只需从手势中调用选择器即可触发以下列表中的任何/每个州。

所以尝试使用任何这些状态

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
    }

答案 2 :(得分:0)

UITapGestureRecognizerUISwipeGestureRecognizer不同,UIPinchGestureRecognizer是连续的。

这意味着Tap和Swipe识别器会在完成后发送消息,但Pinch(和Pan)识别器会在手势进行时不断发送消息,以允许您使用识别器创建交互。

与已建议的一样,您可以检查识别器状态以在控制器结束时显示控制器,您还可以添加一个标志以确保演示文稿不会被调用两次。这样可以提供更大的灵活性,例如只有在夹点达到一定距离时才显示控制器。