【问题标题】:UIPanGestureRecognizer conflicts with UIPinchGestureRecognizer's superviewUIPanGestureRecognizer 与 UIPinchGestureRecognizer 的 superview 冲突
【发布时间】:2015-08-08 11:19:11
【问题描述】:

我有一个 UIScrollView 实例,它有一个子视图,它有自己的 UIPanGestureRecognizer,用于在滚动视图内移动子视图。我希望滚动视图的捏到缩放功能优先于平移手势。然而,情况并非如此:当开始用一根手指捏住我的子视图时,它会平移。

到目前为止我尝试了什么:

  • gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer::它会平移和捏合
  • [panGestureRecognizer requireGestureRecognizerToFail:scrollView.pinchGestureRecognizer];:平移不再起作用(回调仅针对UIGestureRecognizerStateEnded 状态触发)。 panGestureRecognizer.cancelsTouchesInView = NO 也无济于事。

我的理解是,当从子视图开始捏合时,滚动视图和子视图都只接收一次触摸,这就是为什么在第二种情况下捏合手势识别器甚至没有失败,因为它甚至没有开始处理事件。

那么,你知道如何实现这一点吗?

【问题讨论】:

    标签: ios uiscrollview uigesturerecognizer


    【解决方案1】:

    一种方法是允许同时与 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;
    }
    

    【讨论】:

    • 谢谢!事实上,如果 scale 不为 1,则在 disable/enable 技巧之后返回 YES,否则返回 NO,就足够了。
    • YES 与 1 相同。NO 与 0 相同。
    • 我知道,但在您的实施中,您大部分时间都返回 YES。我更喜欢仅在需要时返回 YES,因为它更接近于返回 NO 的默认实现。
    • 很棒的解决方案。谢谢!
    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 2014-12-26
    • 2013-10-27
    • 1970-01-01
    相关资源
    最近更新 更多