如何让UISwipeGestureRecognizer和UIPanGestureRecognizer在同一视图上工作

Shi*_*zam 24 iphone objective-c gesture-recognition uigesturerecognizer

您将如何设置手势识别器,以便您可以同时使用UISwipeGestureRecognizerUIPanGestureRecognizer?这样,如果您快速触摸并快速移动(快速滑动),它会将手势检测为滑动,但如果您触摸然后移动(触摸和移动之间的短暂延迟),它会将其检测为平移?

我已经尝试了requireGestureRecognizerToFail的各种排列,并且没有完全帮助,它使得如果离开SwipeGesture然后我的平移手势将向上,向下和向右工作但是滑动手势检测到任何左移动.

小智 51

您将要将两个UIGestureRecognizer代理中的一个设置为有意义的对象(可能self)然后侦听,并返回YES方法:

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

当通过任一手势识别手势gestureRecognizer或者otherGestureRecognizer阻止其他手势识别器识别其手势时,调用该方法.请注意,YES保证返回可以同时识别; NO另一方面,返回不能保证防止同时识别,因为另一个手势识别器的代表可能会返回YES.


Evg*_*pov 7

默认情况下,当用户尝试滑动时,该手势将解释为平移。这是因为滑动手势在满足将被解释为挥动(离散手势)的必要条件之前,已经满足了将其解释为摇摄(连续手势)的必要条件。

您需要通过调用要延迟的手势识别器上的requireGestureRecognizerToFail:方法来指示两个手势识别器之间的关系

[self.panRecognizer requireGestureRecognizerToFail:self.swipeRecognizer];
Run Code Online (Sandbox Code Playgroud)


2cu*_*ech 5

使用平移识别器检测刷新和平移:

- (void)setupRecognizer
{
    UIPanGestureRecognizer* panSwipeRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanSwipe:)];
    // Here you can customize for example the minimum and maximum number of fingers required
    panSwipeRecognizer.minimumNumberOfTouches = 2;
    [targetView addGestureRecognizer:panSwipeRecognizer];
}

#define SWIPE_UP_THRESHOLD -1000.0f
#define SWIPE_DOWN_THRESHOLD 1000.0f
#define SWIPE_LEFT_THRESHOLD -1000.0f
#define SWIPE_RIGHT_THRESHOLD 1000.0f

- (void)handlePanSwipe:(UIPanGestureRecognizer*)recognizer
{
    // Get the translation in the view
    CGPoint t = [recognizer translationInView:recognizer.view];
    [recognizer setTranslation:CGPointZero inView:recognizer.view];

    // TODO: Here, you should translate your target view using this translation
    someView.center = CGPointMake(someView.center.x + t.x, someView.center.y + t.y);

    // But also, detect the swipe gesture
    if (recognizer.state == UIGestureRecognizerStateEnded)
    {
        CGPoint vel = [recognizer velocityInView:recognizer.view];

        if (vel.x < SWIPE_LEFT_THRESHOLD)
        {
            // TODO: Detected a swipe to the left
        }
        else if (vel.x > SWIPE_RIGHT_THRESHOLD)
        {
            // TODO: Detected a swipe to the right
        }
        else if (vel.y < SWIPE_UP_THRESHOLD)
        {
            // TODO: Detected a swipe up
        }
        else if (vel.y > SWIPE_DOWN_THRESHOLD)
        {
            // TODO: Detected a swipe down
        }
        else
        {
            // TODO:
            // Here, the user lifted the finger/fingers but didn't swipe.
            // If you need you can implement a snapping behaviour, where based on the location of your         targetView,
            // you focus back on the targetView or on some next view.
            // It's your call
        }
    }
}
Run Code Online (Sandbox Code Playgroud)