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)
}
}
与离散的 UITapGestureRecognizer
和 UISwipeGestureRecognizer
不同,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
}
我正在将 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)
}
}
与离散的 UITapGestureRecognizer
和 UISwipeGestureRecognizer
不同,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
}