【问题标题】:How to keep a Lottie animation running when the view is recycled by a tableview?当视图被 tableview 回收时,如何保持 Lottie 动画运行?
【发布时间】:2020-01-04 03:35:30
【问题描述】:

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

到目前为止,一切正常,直到我向下滚动并且UITableViewCell 被回收,这会停止我的动画并且我无法跟踪正确的位置/进度。

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

这是一个相当长的可变长度动画(通常在 20 到 30 秒之间),需要在多个设备之间同步,每当窗帘改变方向时,服务器都会向每个客户端发送一条消息,消息包括方向(打开、关闭或停止)及其位置,以 0% 到 100%(关闭到打开)的百分比表示。

动画连接到一个真实的设备,一个窗帘,它是那个设备的反馈,这就是网络调用的目的,所以它不会循环。根据房间的不同,可能有 2 到 4 个带有动画的单元格,每个单元格和动画对应于不同的窗帘,还有十几个或更多单元格有 0 个动画并且完全不相关。每个单元格都存储一个唯一的 ID、窗帘的最后一次运动、最后接收到的 0% 到 100% 之间的窗帘位置以及动画的持续时间和速度。

页面加载时,所有内容都是从 XML 文件中读取的。然后我使用 TCP 通信来改变开关、按钮和滑块的状态。像这样:https://imgur.com/L5M5mki

有什么建议吗?

【问题讨论】:

    标签: swift uitableview lottie


    【解决方案1】:

    首先,您应该知道哪个单元格是您的动画单元格,并且您不应该将该单元格出列。您将在控制器中创建该单元格,因此动画单元格将永远不会从您的 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
            }
        }
    

    【讨论】:

    • 这里的问题是要知道从哪一帧开始播放。动画是幕布。每次改变方向(打开、关闭或停止)时,我都会收到一条网络消息,但是当我的表格视图在滚动后回收单元格时,我会忘记动画进度。
    • 谢谢,但现在我需要一种方法来让它看起来像动画在离开屏幕时继续运行。我一直在尝试使用 timeIntervalSinceNow 来计算它不在视野范围内的时间并将其添加到进度中,但我还没有到达那里。
    • @Watermamal 我以为你想从它离开(消失)的地方播放它。
    • 不,我希望它继续运行,直到它从网络获得停止信号,即使它不在视野范围内。
    • @Watermamal 那么为什么不干脆不使用动画使单元格出列。如果indexPath 是动画单元格,则在您的控制器和cellForRowAt 中创建您的AnimationCell,返回animationCell 并且不要将其出列。使用这种方法,您的单元永远不会重新初始化。
    【解决方案2】:

    即使您有很多单元格要出列和重用,另一种方法也可以使用:

    在某处保留一个静态/全局字典或缓存,然后在调用tableView:didEndDisplaying: 时将animationView.realtimeAnimationProgress 存储在那里。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 2018-05-09
      • 1970-01-01
      相关资源
      最近更新 更多