UIPanGestureRecognizer 与 UIPinchGestureRecognizer 的超级视图冲突
UIPanGestureRecognizer conflicts with UIPinchGestureRecognizer's superview
我有一个带有子视图的 UIScrollView 实例,它有自己的 UIPanGestureRecognizer,用于在滚动视图内移动子视图。我希望滚动视图的捏合缩放功能优先于平移手势。然而,情况并非如此:当开始用一根手指在我的子视图上捏合时,它会平移。
到目前为止我尝试了什么:
gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
:它会平移和收缩
[panGestureRecognizer requireGestureRecognizerToFail:scrollView.pinchGestureRecognizer];
:平移将不再起作用(仅在 UIGestureRecognizerStateEnded
状态下触发回调)。 panGestureRecognizer.cancelsTouchesInView = NO
也无济于事。
我的理解是,当从子视图开始捏合时,滚动视图和子视图都只接收一次触摸,这就是为什么在第二种情况下捏合手势识别器甚至不会失败,因为它不会甚至开始处理事件。
那么,关于如何实现这一点有什么想法吗?
一种方法是允许与 scrollView.pinchGestureRecognizer 同时交互,然后如果 scrollView.pinchGestureRecognizer 实际上正在缩放,则取消 panGestureRecognizer。我知道如何取消它们的唯一方法是 disable/enable.
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
if (gestureRecognizer == panGestureRecognizer){
if (otherGestureRecognizer == scrollView.panGestureRecognizer) {
return 0;
}
else if(otherGestureRecognizer == scrollView.pinchGestureRecognizer){
if (scrollView.pinchGestureRecognizer.scale != 1) {
gestureRecognizer.enabled = 0;
gestureRecognizer.enabled = 1;
}
}
}
return 1;
}
我有一个带有子视图的 UIScrollView 实例,它有自己的 UIPanGestureRecognizer,用于在滚动视图内移动子视图。我希望滚动视图的捏合缩放功能优先于平移手势。然而,情况并非如此:当开始用一根手指在我的子视图上捏合时,它会平移。
到目前为止我尝试了什么:
gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
:它会平移和收缩[panGestureRecognizer requireGestureRecognizerToFail:scrollView.pinchGestureRecognizer];
:平移将不再起作用(仅在UIGestureRecognizerStateEnded
状态下触发回调)。panGestureRecognizer.cancelsTouchesInView = NO
也无济于事。
我的理解是,当从子视图开始捏合时,滚动视图和子视图都只接收一次触摸,这就是为什么在第二种情况下捏合手势识别器甚至不会失败,因为它不会甚至开始处理事件。
那么,关于如何实现这一点有什么想法吗?
一种方法是允许与 scrollView.pinchGestureRecognizer 同时交互,然后如果 scrollView.pinchGestureRecognizer 实际上正在缩放,则取消 panGestureRecognizer。我知道如何取消它们的唯一方法是 disable/enable.
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
if (gestureRecognizer == panGestureRecognizer){
if (otherGestureRecognizer == scrollView.panGestureRecognizer) {
return 0;
}
else if(otherGestureRecognizer == scrollView.pinchGestureRecognizer){
if (scrollView.pinchGestureRecognizer.scale != 1) {
gestureRecognizer.enabled = 0;
gestureRecognizer.enabled = 1;
}
}
}
return 1;
}