我正试图为我的一个视图实现分页交互。我以为我会用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
...
}
}
答案 0 :(得分:1)
是的,如果您希望“滑动”的特定速度,角度,更改等触发动画,请使用UIPanGestureRecognizer
。 UISwipeGestureRecognizer
确实是单个离散手势;类似于UITapGestureRecognizer
,它会在识别时触发单个操作消息。
在物理学中,UIPanGestureRecognizer
的“速度”将指示平移手势的速度和方向。以下是docs for velocityInView:
method,它将帮助您以每秒点数计算更改平移手势的水平和垂直分量。