почему происходит задержка при перемещении объекта с использованием UIPanGestureRecognizer

Я перемещаю объект UIView с помощью UIPanGestureRecognizer - насколько сильно я перетаскиваю палец на экране, насколько сильно я перемещаю вид в одном направлении (только по X - влево или вправо, Y не изменяется). Работает нормально, но с (очень заметной) задержкой.

Вот метод, который обрабатывает событие UIPanGestureRecognizer:

-(void)movePages:(UIPanGestureRecognizer *)sender
{
    if(switchingMode == 1){
        if([sender state] == UIGestureRecognizerStateBegan){
            fingerStartPosition = [sender locationInView:self.view].x;
            viewStartPosition = [[viewControllers objectAtIndex:activeViewControllerIndex] view].center;
        }
        [[[[viewControllers objectAtIndex:activeViewControllerIndex] view] layer] setPosition:CGPointMake(viewStartPosition.x - (fingerStartPosition - [sender locationInView:self.view].x) , viewStartPosition.y)];

    }
}

Я пытался установить положение вида, используя его слой, я также пытался установить кадр, используя анимацию разной длительности, но все вели себя одинаково. Есть идеи, почему происходит такая задержка?

Ответы на вопрос(3)

UILongPressGestureRecognizer и установитеminimumPressDuration в0.0. Это мгновенно распознается, и вы получаете все те же обновления, включаяUIGestureRecognizerStateChanged с обновленным местоположением.

что он быстрее реагирует, если вы используете только обычные касания Began, Moved и Ended. Я даже подклассифицировал UIGestureRecognizer, и у него все еще была задержка в панорамировании. Даже если touchesBegan в UIGestureRecognizer будет срабатывать вовремя, изменение состояния займет полсекунды, чтобы изменить его состояние ... Кажется, быстрее просто использовать обычный старый TouchesBegan, особенно если вы работаете с процессором.

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

если это жест панорамирования, до того, как вы переместили палец на несколько пикселей. Я не знаю точного значения допуска, но именно поэтому вы чувствуете задержку.

Документация

Жест панорамирования продолжается. Он начинается тогда, когда минимальное количество пальцев, которое можно переместить, достаточно для того, чтобы считаться панорамированием.

Если вы хотите мгновенного движения, вам, вероятно, нужно создать собственную логику, используяtouchesMoved:.

Другой подход - оживить до первой узнаваемой точки. Но это не снимает задержку. Для такого подхода вы можете взглянуть на мой JDDroppableView на github.

ВАШ ОТВЕТ НА ВОПРОС