【问题标题】:How to mimic tableview movement with CAMediaTimingFunction如何使用 CAMediaTimingFunction 模拟 tableview 移动
【发布时间】:2014-06-22 09:50:25
【问题描述】:

我有一个 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 属性来做到这一点?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    尝试使用UIAnimation 并将动画曲线设置为UIViewAnimationCurveEaseOut 使用

    + (void)setAnimationCurve:(UIViewAnimationCurve)curve.

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

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

    【讨论】:

    • 我使用了 [UIScrollViewDelegate scrollViewDidScroll:] 方法,效果很好。
    • 我会尝试缓出曲线。根据我使用 scrollViewDidScroll 的经验,我最终得到的模拟视图跳动且不流畅。
    • 我尝试了动画,不幸的是,持续时间有点偏离,曲线似乎仍然偏离。好像每次调用scrollViewDidScroll都需要更新,但我不知道如何摆脱跳动。
    【解决方案2】:

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

    除非你能找到对所有这些东西进行逆向工程的人,否则我建议你尝试找到一种方法,让原始 UIScrollView(即 UI TableView)驱动其他视图的动画以及它自己的内容。

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

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

    WWDC 2012,会话“使用滚动视图增强用户体验”,给出了一个捕获 UIScrollView 的滚动动作并使用它来驱动 OpenGL 视图动画的示例。

    【讨论】:

      【解决方案3】:

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

      scrollViewDidScroll: 的诀窍是不使用动画,而是直接设置帧或位置。委托被如此频繁地回调,以至于动画看起来很糟糕。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-09
        • 1970-01-01
        • 2011-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-30
        • 1970-01-01
        相关资源
        最近更新 更多