UIPanGestureRecognizer与UIPinchGestureRecognizer的父视图存在冲突

4
我有一个UIScrollView实例,其中包含一个子视图,该子视图具有自己的UIPanGestureRecognizer,用于在滚动视图中移动子视图。我希望滚动视图的捏合缩放功能优先于平移手势。然而,情况并非如此:当我用一根手指在我的子视图上开始捏合时,它会转而变成平移手势。
我尝试过以下方法:
- gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: :它将同时进行平移和缩放 - [panGestureRecognizer requireGestureRecognizerToFail:scrollView.pinchGestureRecognizer]:平移不再起作用(回调仅在UIGestureRecognizerStateEnded状态下触发)。并且panGestureRecognizer.cancelsTouchesInView = NO无法解决问题。
我的理解是,当从子视图开始捏合时,滚动视图和子视图只接收到一次触摸,这就是为什么在第二种情况下,捏合手势识别器甚至不会失败,因为它甚至没有开始处理事件。
那么,有什么办法可以实现这个目标吗?
1个回答

5

一种方法是允许与scrollView.pinchGestureRecognizer同时交互,如果scrollView.pinchGestureRecognizer正在缩放,则取消panGestureRecognizer。我知道的唯一取消它们的方法是禁用/启用。

-(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;
}

谢谢!实际上,如果比例尺不是1,则在禁用/启用技巧后返回YES,否则返回NO就足够了。 - PatrickNLT
是和1相同的。否和0相同。 - dave234
我知道,但在你的实现中,大多数情况下都返回YES。我更喜欢只在需要时返回YES,因为它更接近默认实现,即返回NO。 - PatrickNLT
太棒了,解决方案非常好。谢谢! - swebal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接