解决两个平移手势识别器之间的冲突

Ben*_*air 4 objective-c ios uipangesturerecognizer

我有以下层次结构:

  • 看法
    • 子视图

这些视图中的每一个都已UIPanGestureRecognizer分配。外部平移手势识别器仅对垂直平移感兴趣,因此我为此实现了委托方法:

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)panGestureRecognizer {
    CGPoint velocity = [panGestureRecognizer velocityInView:panGestureRecognizer.view];
    return fabs(velocity.y) > fabs(velocity.x);
}
Run Code Online (Sandbox Code Playgroud)

然而,子视图的平移手势在识别中始终优先。有没有办法让外部平移手势识别器首先识别,然后如果失败,子视图中的平移手势可以接管?

我尝试同时识别并且它有效,但随后两个识别器都开始平移:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 

    shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
        return YES;
    }
Run Code Online (Sandbox Code Playgroud)

天才小*_*小飞猫 5

从 iOS 7 开始,UIGestureRecognizerDelegate 协议已经根据您的需要声明了两个委托方法,您可以使用 | 手势识别器:shouldRequireFailureOfGestureRecognizer: | 或 | gestureRecognizerShouldBegin:shouldBeRequiredToFailByGestureRecognizer: | 但以相反的方式。

以下代码片段是我的 UIPanGestureRecognizer 委托实现:

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)panGestureRecognizer {
    CGPoint velocity = [panGestureRecognizer velocityInView:panGestureRecognizer.view];
    return fabs(velocity.y) > fabs(velocity.x);
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    if (otherGestureRecognizer == panGestureOfSubView) {
        return YES;
    }

    return NO;
}
Run Code Online (Sandbox Code Playgroud)