在设置requireGestureToFail后,将UIPanGestureRecognizer和UISwipeGestureRecognizer添加到同一视图会导致冲突

Avn*_*arr 5 objective-c uigesturerecognizer ios uipangesturerecognizer

我在同一个视图中添加了一个滑动手势识别器和一个平移手势识别器.这些手势应该是彼此独有的.

为了做到这一点,我在滑动手势上添加了约束

[swipeGesture requireGestureToFail:panGesture];
Run Code Online (Sandbox Code Playgroud)

(因为平移手势应该优先)

问题是总是调用平移手势 - 即使在非常快速的滑动过程中也是如此.

为了克服这个问题,我把自己定位为泛手势的代表.在委托方法中,我设置了一些代码,如下所示:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    // check if it is the relevant view
    if (gestureRecognizer.view == self.myViewWithTwoGestures)
    {
        // check that it is the pan gesture
        if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]])
        {
            UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureRecognizer;
            CGPoint velocity = [pan velocityInView:gestureRecognizer.view];
            // added an arbitrary velocity for failure
            if (ABS(velocity.y) > 100)
            {
                // fail if the swipe was fast enough - this should allow the swipe gesture to be invoked
                return NO;
            }
        }
    }
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

是否有建议的速度来确保良好的行为?还有另一种方法可以强制平移手势失败吗?

Gad*_*Gad 10

根据苹果的文档这里(下声明一个特定的顺序为两个姿势识别器),以获得这两个方式UIPanGestureRecognizer,并UISwipeGestureRecognizer在同一个视图中工作是需要UISwipeGesureRecognizer调用之前失败UIPanGestureRecognizer(你写的正好相反).这可能与滑动手势也是平移手势的事实有关,但相反的情况不一定如此(参见此SO问题).

我写了这段小代码,它设法识别平移和滑动手势:

UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panned:)];
UISwipeGestureRecognizer * swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swiped:)];
[pan requireGestureRecognizerToFail:swipe];
swipe.direction = (UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight);

-(void)panned:(UIPanGestureRecognizer *)gesture
{
    NSLog(@"Pan");
}

-(void)swiped:(UISwipeGestureRecognizer *)gesture
{
    NSLog(@"Swipe");
}
Run Code Online (Sandbox Code Playgroud)

这并不像你希望的那样好(因为你需要滑动手势失败,在平移手势开始之前有一个小延迟),但它确实有效.但是,您发布的代码可让您根据自己的喜好微调手势.