why is there a delay when moving object using UIPanGestureRecognizer why is there a delay when moving object using UIPanGestureRecognizer ios ios

why is there a delay when moving object using UIPanGestureRecognizer


Use a UILongPressGestureRecognizer and set the minimumPressDuration to 0.0. This recognizes instantly and you get all the same updates including the UIGestureRecognizerStateChanged with the updated location.


I found that it was faster responding if you use just regular touchesBegan, Moved and Ended. I even subclassed a UIGestureRecognizer, and it still had lag on the panning gesture. Even though the touchesBegan within the UIGestureRecognizer would trigger on time, the state change would take a half second to change its state... It seems faster to just use a plain old TouchesBegan, especially if you're cpu is doing a lot.

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?){    if touches.count == 1    {        initialTouchLocation = (touches.first?.locationInView(self).x)!    }}override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?){    if touches.count == 1    {        let locationInView = touches.first?.locationInView(self)        if !thresholdHit        {            //this is the threshold for x movement in order to trigger the panning...            if abs(initialTouchLocation - locationInView!.x) > 1            {                thresholdHit = true            }        }        else        {            if (self.frame.width != CGFloat(screenSize))            {                let panDelta = initialTouchLocation - locationInView!.x            }        }    }}


The GestureRecognizer can't be sure, if it is a pan gesture, before you moved your finger some pixels. I don't know the exact tolerance value, but that is why you feel a delay.

Documentation:

A panning gesture is continuous. It begins when the minimum number of fingers allowed have moved enough to be considered a pan.

If you want instant movement, you probably need to build your own logic using touchesMoved:.

Another approach could be, to animate to the first recognized point. But that doesn't remove the delay.For that approach you could have a look at my JDDroppableView on github.