我移动使用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)];
}
}
我已经尝试使用其层设置视图的位置,我也试着设置框,使用动画与不同的持续时间,但一切表现是相同的。 知道为什么这发生延迟?
使用UILongPressGestureRecognizer
和设置minimumPressDuration
至0.0
。 这立即识别,你会得到所有相同的更新包括UIGestureRecognizerStateChanged
与更新的位置。
我发现,如果你使用的只是普通的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
}
}
}
}
该GestureRecognizer不能肯定,如果它是一个平移手势,你移动你的手指有些像素前。 我不知道确切的公差值,但是这就是为什么你觉得延迟。
文档:
平移手势是连续的。 它开始时允许手指的最小数量已经转移到足以被视为一个锅。
如果你想快速的运动,你可能需要使用建立自己的逻辑touchesMoved:
另一种方法可能是,以动画的第一个可识别点。 但是,这并不删除延迟。 对于这种方法,你可以看看我的JDDroppableView GitHub上。