Adicionar um UIPanGestureRecognizer e um UISwipeGestureRecognizer à mesma exibição causa conflitos após a configuração de requireGestureToFail

Adicionei um reconhecedor de gesto de furto e um reconhecedor de gesto de panorâmica à mesma exibição. Esses gestos devem ser exclusivos um do outro.

Para fazer isso, adicionei a restrição no gesto de furto

[swipeGesture requireGestureToFail:panGesture];

(porque o gesto de pan deve ter precedência)

O problema é que o gesto de deslocamento é sempre invocado - mesmo durante um furto muito rápido.

Para superar isso, eu me pus como delegado do gesto de pan. No método delegado, configurei um código da seguinte maneira:

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

Existe uma velocidade sugerida para garantir um bom comportamento? Existe outra maneira de forçar o gesto de pan a falhar?

questionAnswers(2)

yourAnswerToTheQuestion