17

我正在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)];            
    }
}

我尝试使用其图层设置视图的位置,我还尝试设置框架,使用具有不同持续时间的动画,但一切都表现相同。知道为什么会发生这种延迟吗?

4

3 回答 3

44

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.

于 2012-12-01T19:38:47.337 回答
4

我发现如果只使用常规的 touchesBegan、Moved 和 Ended,响应速度会更快。我什至对 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
            }
        }
    }
}
于 2016-02-19T06:34:56.867 回答
3

在您将手指移动一些像素之前,GestureRecognizer 无法确定它是否是平移手势。我不知道确切的容差值,但这就是您感到延迟的原因。

文档:

平移手势是连续的。当允许的最小手指数移动到足以被视为平底锅时,它就开始了。

如果您想要即时移动,您可能需要使用touchesMoved:.

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

于 2012-05-23T21:29:39.817 回答