模拟UIScrollView减速

3

我有一个 UIPanGestureRecognize,用于改变视图的框架。当手势的状态为 UIGestureRecognizerStateEnded 时,有没有一种方法可以模拟 UIScrollViewUITableView 的减速效果?这是我的当前代码:

if (panGesture.state == UIGestureRecognizerStateEnded)
{
    [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
    self.view.frame = CGRectMake(182, 0, self.view.frame.size.width, self.view.frame.size.height);
}
                 completion:^(BOOL finished) {
                     if (finished) {
                        //Do something
                     }
                 }];
}

但这不是平滑滚动。我想要的是一种减速到达我设定的点并停止的效果。谢谢。
2个回答

14

2012年WWDC的223号会议,“使用滚动视图增强用户体验”,介绍了一种利用滚动视图的行为和“感觉”来动画显示不同视图位置的方法(而无需将滚动视图实际显示给用户)。

该会议展示的方法的好处是,您的减速始终与UIScrollView的匹配,现在和未来都是如此。

https://developer.apple.com/videos/wwdc/2012/?id=223


2
我很高兴这个方法在2013年对你们有用,但如果你能加上一些实际的代码就更好了,因为现在视频不可用,即使它可用,我也不会在工作时很自在地观看它。 - Starsky
对我来说,会话似乎现在可用了。它基本上是说你应该在某个地方放置一个不可见的滚动视图,在应该可滚动的区域放置一个简单的UIView,并将该滚动的pan手势重新附加到简单的视图上。然后有一个滚动代理,你可以获取它的偏移量,这将像普通滚动视图一样减速。我不知道我刚看到了什么,我认为这太荒谬了。 - glassomoss

1

您需要设计一种算法来计算视图停止的位置,这取决于手势的速度,可以通过以下方式获得:

CGPoint velocity = [panGesture velocityInView:panGesture.view];

接下来,只需要将您的视图动画化到其计算出的静止位置并添加一个动画来实现。我相信在这里使用UIViewAnimationOptionCurveEaseOut是比较合适的。


1
我知道我想让它停止的确切点。没有必要计算它。但是你给了我一个很好的想法来改变动画选项。UIViewAnimationOptionCurveEaseInOut 对我有用。 - Andrei Filip
@Jeff 添加的第二个答案是更好的方法。 - Benjohn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接