当一个表视图回收视图时,如何保持抽奖动画运行?

时间:2019-08-30 23:52:36

标签: swift uitableview lottie lottie-ios

我有一个UITableView,其中包含许多不同的自定义单元格,其中的1个具有很多动画视图,当我按下按钮或收到某些网络消息时,该动画应该跳到特定位置/进度,然后向前或向后动画。

到目前为止,一切都很好,直到我向下滚动并且UITableViewCell被回收,这停止了我的动画并且我无法正确定位/前进。

我已经考虑过可能要使用计时器,并尝试使其与动画进度同步,或者实例化一个隐藏的LottieAnimationView并将其与可见的计时器同步。有人处理过这个问题吗?有什么建议吗?

更新:有关窗帘/门的相当长的动画,需要在多个设备上进行同步,有关更多详细信息,每当窗帘改变方向时,服务器都会向我发送消息给每个客户端,消息包括方向(打开,关闭或停止),其位置百分比为0%到100%(已关闭)

2 个答案:

答案 0 :(得分:0)

首先,您应该知道哪个单元是您的动画单元,并且不应该使该单元出队。您将在控制器中创建该单元格,这样就永远不会从UITableView中重新初始化动画单元格。

    let animationCell = AnimationCell()

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       if indexPath.row == 0 { //0 is the animation cell
         return animationCell
        } else { 
         // try to dequeue your regular cell
        }
    }

答案 1 :(得分:0)

即使您有很多要出队和重复使用的单元格,另一种方法也将起作用:

将静态/全局词典或高速缓存保留在某个地方,然后在调用animationView.realtimeAnimationProgress时将tableView:didEndDisplaying:存储在此处。

然后在tableView:willDisplay:中,您可以将该值分配回animationView.currentProgress,然后以您最初玩的任何原始结束状态调用play(toProgress:)

这样,即使在新单元格中,动画也可以恢复。如果您有复杂的用例,只需存储其他信息,例如原始的所需最终状态和循环行为。您可能还需要存储当前的实际时间,以调整进度,以便在动画从屏幕上滚动下来并冻结后,从冻结动画以来经过的实际时间已经过去了,并且您希望它像时间过去了一样返回,而不是及时冻结。