【问题标题】:How to make a dragging UIView decelerating?如何使拖动的 UIView 减速?
【发布时间】:2011-05-02 11:57:06
【问题描述】:

我有一个可以用手指拖动的 UIView,我使用 UIPanGestureRecognizer 实现了它。这允许我水平拖动视图;左或右。

我在从 UIPanGestureRecognizer 接收以下状态时使我的视图移动(使用 translationInView: 方法):

  • UIGestureRecognizerStateBegan
  • UIGestureRecognizerStateChanged

现在发生的情况是,一旦手指离开屏幕表面,视图就会停止移动,这会呈现非自然的效果。

我想要的是,拖动视图从 UIGestureRecognizerStateEnded 状态开始通过平稳停止而减速。

UIScrollView 类和子类(UIWebView、UITableView 等)使用这种行为。

我已经尝试了几种方法,通过计算速度、触摸发生的时间和停止停止距离等。但老实说,我有一种无处可去的自然行为的感觉。我什至尝试使用像 Chipmunk 这样的物理引擎。但我发现这对于我试图实现的目标来说很复杂,而且我很确定应该有一个更好(如果不是更简单的话)的解决方案。

非常感谢!

杰里米

【问题讨论】:

  • 你尝试过 UIScrollView decelerationRate 吗?
  • 我根本没有使用 UIScrollView,也没有使用子类。我只是想实现一个减速机制。
  • 目前还没有完美的解决方案...如果您有想法,欢迎您!但坦率地说,我认为最好的方法是使用能够无缝处理所有这些的物理引擎。

标签: iphone ipad uiview ios


【解决方案1】:

在您的手势识别器中,设置为当您的手指离开屏幕时,您开始动画以继续在短时间内滚动一点,并带有“Ease Out”过渡。

可能是这样的:

[UIView beginAnimations:@"FingerOff" context:nil];
[UIView setAnimationDuration:0.25f];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDelegate:self];
[UIView setAnimationCurve:UIAnimationViewEaseOut];
[myView setFrame:newFrame];
[UIView commitAnimation];

您可以将 setFrame 替换为其他内容 - 任何确定您希望如何滚动或查看的内容 - 甚至可以是 setCenter。让它比当前位置“更远”一点。

【讨论】:

  • 我刚试过,我想我还是需要根据手势的速度来估计停止距离。因为否则这一举动会让人感觉不自然。
  • 是的 - 您需要调整动画时间和“newFrame”以使其正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多