使用UIPanGestureRecognizer移动对象时为什么会出现延迟

时间:2012-05-23 21:24:15

标签: iphone ios delay uipangesturerecognizer

我使用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)];

    }
}

我尝试使用图层设置视图的位置,我也尝试使用不同持续时间的动画设置框架,但所有内容都表现相同。知道为什么会出现这种延迟吗?

3 个答案:

答案 0 :(得分:40)

使用UILongPressGestureRecognizer并将minimumPressDuration设置为0.0。这会立即识别并获得所有相同的更新,包括UIGestureRecognizerStateChanged和更新的位置。

答案 1 :(得分:2)

如果是手势,GestureRecognizer无法确定手指移动一些像素。我不知道确切的公差值,但这就是你感到延迟的原因。

文档:

  

平移手势是连续的。当允许的最小手指移动到足以被视为平移时开始。

如果您想要即时移动,则可能需要使用touchesMoved:构建自己的逻辑。

另一种方法可以是动画到第一个被识别的点。但这并没有消除延迟。 对于这种方法,您可以查看我在github上的JDDroppableView

答案 2 :(得分:2)

如果你只使用常规touchesBegan,Moved和Ended,我发现响应速度更快。我甚至将UIGestureRecognizer子类化,并且它仍然在平移手势上有延迟。即使UIGestureRecognizer中的touchesBegan会按时触发,状态改变也需要半秒才能改变其状态......使用普通的旧TouchesBegan似乎更快,特别是如果你的cpu做了很多事情

re.findall('url\(([^)]+)\)',target_text)
相关问题