如果我想跟踪移动,是否必须使用UIPanGestureRecognizer而不是UISwipeGestureRecognizer?

时间:2014-11-21 21:32:59

标签: ios ios7 uipangesturerecognizer uiswipegesturerecognizer

我正试图为我的一个视图实现分页交互。我以为我会用UISwipeGestureRecognizers。但通过试验和错误以及对文档的检查,似乎

  

滑动是离散手势,因此是关联的动作消息   每个手势只发送一次。

因此,虽然我可以触发页面,但我无法连接拖动过程中发生的动画。

我唯一的选择是使用UIPanGestureRecognizer并重新实现滑动的基本过滤/计算吗?

更新/终极版

事后来看,我真正应该问的是如何实现一个"轻弹"手势。如果您不打算使用自己的子类(可能会稍微关闭一下),则使用UIPanGestureRecognizer作为@Lyndsey的答案指示。在那之后(在评论中)我正在寻找的是如何制作轻弹部分,其中轻弹的动量有助于决定是否进行轻弹动作或快速回到原始演示。

UIScrollView有这样的行为,它很有可能挖掘它的实现,以获取有关如何以一致的方式减速动量的详细信息,但是为decelerationRate提供UIScrollView是每次迭代""价值(根据一些)。我打破了如何正确地将默认值0.998应用到我的平底锅的最终速度。

最后,我使用从网站上提取的代码" flick"计算并在我的手势处理程序中做了类似的事情:

...
else if (pan.state == UIGestureRecognizerStateEnded) {
    CGFloat v = [pan velocityInView: self.view].x;
    CGFloat a = -4000.0; // 4 pixels/millisecond, recommended on gavedev
    CGFloat decelDisplacement = -(v * v) / (2 * a); // physics 101
    // how far have we come plus how far will momentum carry us?
    CGFloat totalDisplacement = ABS(translation) + decelDisplacement;
    // if that is (or will be) half way across our view, finish the transition
    if (totalDisplacement >= self.view.bounds.size.width / 2) {
        // how much time would we need to carry remainder across view with current velocity and existing displacement? (capped)
        CGFloat travelTime = MIN(0.4, (self.view.bounds.size.width - ABS(translation)) * 2 / ABS(v));
        [UIView animateWithDuration: travelTime delay: 0.0 options: UIViewAnimationOptionCurveEaseOut animations:^{
            // target/end animation positions
        } completion:^(BOOL finished) {
            if (finished) {
                // any final state change
            }
        }];
    }
    else { // put everything back the way it was
        ...
    }
}

1 个答案:

答案 0 :(得分:1)

是的,如果您希望“滑动”的特定速度,角度,更改等触发动画,请使用UIPanGestureRecognizerUISwipeGestureRecognizer确实是单个离散手势;类似于UITapGestureRecognizer,它会在识别时触发单个操作消息。

在物理学中,UIPanGestureRecognizer的“速度”将指示平移手势的速度和方向。以下是docs for velocityInView: method,它将帮助您以每秒点数计算更改平移手势的水平和垂直分量。