2015-05-20 68 views
0

我將UIPinchGestureRecognizer添加到顯示圖像的scrollView中。 捏,我提出一個新的看法。UIPinchGestureRecognizer正在兩次觸發

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

showFullScreen功能:

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

但是,當我掐上滾動視圖,showFullScreen被稱爲兩次,因爲它的下面的錯誤出現:

終止應用程序由於未捕獲的異常' NSInvalidArgumentException',原因:'應用程序試圖以模態方式呈現活動控制器

我正在尋找解決方案,他們建議刪除pinchGesture,但我想保留gestureRecognizer,這樣用戶仍然可以捏合進入全屏。

我該怎麼做才能確保showFullScreen僅被稱爲一次捏?

+0

手勢識別有狀態(如開始,感動),你應該以不同的方式對待每個狀態。對於捏,你可能會檢查sender.state是否被識別,然後運行你的代碼。 – Erakk

+0

比較手勢的狀態,並且只在當gesture.state = UIGestureRecognizerState.Ended時執行當前視圖控制器 –

回答

3

嘗試:

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

不同於UITapGestureRecognizerUISwipeGestureRecognizer,這是離散的,UIPinchGestureRecognizer是連續的。

這意味着點擊和滑動識別器會在完成後發送消息,但捏合(和平移)識別器會在手勢進行時持續發送消息,以允許您使用識別器創建交互。

就像已經提出的一樣,您可以檢查識別器狀態以顯示控制器何時結束,還可以添加標誌以確保演示文稿不會被調用兩次。這會給你更多的靈活性,比如只有當夾點達到一定距離時才顯示控制器。

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 
    }