如何使用CAMediaTimingFunction模仿tableview移动

时间:2014-05-05 23:30:17

标签: ios objective-c uitableview uiscrollview core-animation

我有一个tableview和另一个视图,我想动画另一个视图,使其减速并同时停止和动画曲线一样滚动时的tableview。所以,我认为我可以实现

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset

并使用velocity(每毫秒像素数),targetContentOffset和tableview的decelerationRate属性来计算停止使用该文件所需的时间物理方程d= (vi+vf) / 2 * t来计算动画的持续时间。 一旦我拥有了这个,我只需要动画以与tableView相同的速度减速,这样它们就会看起来已经同步了。如何使用CAMediaTimingFunction和tableview' decelerationRate属性来完成此操作?

谢谢!

3 个答案:

答案 0 :(得分:0)

尝试使用UIAnimation并使用

将动画曲线设置为UIViewAnimationCurveEaseOut

+ (void)setAnimationCurve:(UIViewAnimationCurve)curve

使用time = velocity / acceleration计算动画持续时间。

另一种方法是使用[UIScrollViewDelegate scrollViewDidScroll:]因为我相信只要滚动视图仍在滚动,即使用户已停止拖动,也会继续调用它。

答案 1 :(得分:0)

仅使用decelerationRateCAMediaTimingFunction可能无法做到这一点。原因是UIScrollView(您的UITableView是一个实例)不会公开用于减速的定时功能。另外,据我们所知,UIScrollView使用的计时功能可能无法仅从decelerationRate完全计算出来。它也可能考虑到其他因素,如速度,仍然可用的空间长度,甚至是你看不到的因素等。

除非你能找到一个反向设计所有这些东西的人,否则我建议你试着让原始的UIScrollView(即UI TableView)驱动另一个视图的动画。自己的内容。

例如,您是否可以简单地将其他视图设为UITableCell s或UITableView本身之一的子视图,以便继承其所有动作?如果你没有剪辑到界限,那可能会很好。如果在适当的委托方法之前和之后进行了视图层次结构操作,您甚至可以在减速期间执行此操作。

或者,您可以实现委托方法scrollViewDidScroll:,抓住滚动视图的contentOffset,并使用它来计算其他视图的位置,并手动设置其框架。这可能仅适用于用户驱动的滚动,而不是自动减速。此外,您可能需要了解NSRunLoop模式的详细信息,以确保在滚动事件期间应用的更改生效。

WWDC 2012,会话"使用滚动视图增强用户体验",提供捕获UIScrollView的滚动动作并使用它来驱动OpenGL视图动画的示例。

答案 2 :(得分:0)

我建议插入scrollViewDidScroll:委托回调并使用其中的偏移来重新定位其他视图。你甚至可以在scrollViewWillEndDragging中设置一个标志:开始监听scrollViewDidScroll:。这是我所知道的与运动完全匹配的唯一方式。

scrollViewDidScroll的技巧:不使用动画,而是直接设置框架或位置。代表被频繁回叫,动画看起来很糟糕。