我将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
一次?
答案 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)
与UITapGestureRecognizer
和UISwipeGestureRecognizer
不同,UIPinchGestureRecognizer
是连续的。
这意味着Tap和Swipe识别器会在完成后发送消息,但Pinch(和Pan)识别器会在手势进行时不断发送消息,以允许您使用识别器创建交互。
与已建议的一样,您可以检查识别器状态以在控制器结束时显示控制器,您还可以添加一个标志以确保演示文稿不会被调用两次。这样可以提供更大的灵活性,例如只有在夹点达到一定距离时才显示控制器。