Adding a UIPanGestureRecognizer and a UISwipeGestureRecognizer to same view causes conflicts after setting requireGestureToFail

前端 未结 2 1227
谎友^
谎友^ 2020-12-19 12:20

I added a swipe gesture recognizer and a pan gesture recognizer to the same view. These gestures should be exclusive to each other.

In order to do this I added the c

2条回答
  •  谎友^
    谎友^ (楼主)
    2020-12-19 13:10

    Late response, but I was having a similar issue where I wanted to pan to be recognized before the swipe. The only way I could get it working was to use a long press (or something similar) to set a flag to use the pan gesture as a pan or a swipe. I ended up not using swipes at all. I.e.:

    - (void) handleLongPress : (UILongPressGestureRecognizer *) gestureRecognizer
    {
        if (gestureRecognizer.state == UIGestureRecognizerStateBegan)
        {
            _canSwipe = YES;
        }
        else if (gestureRecognizer.state == UIGestureRecognizerStateEnded)
        {
            _canSwipe = NO;
        }
    }
    
    - (void) handleDragging : (id) sender
    {
        UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)sender;
        GLKVector2 dragDelta = GLKVector2Make(0., 0.);
    
        if (pan.state == UIGestureRecognizerStateBegan || pan.state == UIGestureRecognizerStateChanged)
        {
            _mousePosition = [pan translationInView:self.view];
            if (_beginDragging == NO)
            {
                _beginDragging = YES;
            }
            else
            {
                dragDelta = GLKVector2Make(_mousePosition.x - _prevMousePosition.x, _mousePosition.y - _prevMousePosition.y);
            }
    
            _prevMousePosition = _mousePosition;
        }
        else
        {
            _beginDragging = NO;
        }
    
        if (_canSwipe == YES)
        {
            if (dragDelta.x > 0)
            {
                _canSwipe = NO;
                [self.navigationController popToRootViewControllerAnimated:YES];
                NSLog(@"swipe right");
            }
            else if (dragDelta.x < 0)
            {
                _canSwipe = NO;
                [self performSegueWithIdentifier:@"toTableSegue" sender:pan];
                NSLog(@"swipe left");
            }
        }
        else
        {
            _dragDeltaTranslation = GLKVector2Make(dragDelta.x/90, dragDelta.y/90);
            _translationXY = GLKVector2Make(_translationXY.x + _dragDeltaTranslation.x, _translationXY.y - _dragDeltaTranslation.y);
        }
    }
    

    So essentially:

    1. Use long press (or some other mechanism) to activate a state of swiping (long press is nice because as soon as you release, the state goes to UIGestureRecognizerStateEnded)
    2. Then use the pan direction to determine the direction of the swipe. 2.

提交回复
热议问题