为什么会出现使用UIPanGestureRecognizer移动对象时的延迟(why is ther

2019-07-29 13:12发布

我移动使用UIPanGestureRecognizer的UIView对象 - 我是多么拖我的手指在屏幕上,那么多我移动视图在同一方向(仅在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)];

    }
}

我已经尝试使用其层设置视图的位置,我也试着设置框,使用动画与不同的持续时间,但一切表现是相同的。 知道为什么这发生延迟?

Answer 1:

使用UILongPressGestureRecognizer和设置minimumPressDuration0.0 。 这立即识别,你会得到所有相同的更新包括UIGestureRecognizerStateChanged与更新的位置。



Answer 2:

我发现,如果你使用的只是普通的touchesBegan,感动,结束了更快的响应。 我甚至子类一个UIGestureRecognizer,它仍然有上平移手势滞后。 即使UIGestureRecognizer内的touchesBegan将如期触发,状态变化将采取半秒改变其状态......它似乎更快,只使用普通的旧的touchesBegan,特别是如果你的CPU是做了很多。

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


Answer 3:

该GestureRecognizer不能肯定,如果它是一个平移手势,你移动你的手指有些像素前。 我不知道确切的公差值,但是这就是为什么你觉得延迟。

文档:

平移手势是连续的。 它开始时允许手指的最小数量已经转移到足以被视为一个锅。

如果你想快速的运动,你可能需要使用建立自己的逻辑touchesMoved:

另一种方法可能是,以动画的第一个可识别点。 但是,这并不删除延迟。 对于这种方法,你可以看看我的JDDroppableView GitHub上。



文章来源: why is there a delay when moving object using UIPanGestureRecognizer