单元重用后如何恢复CAAnimation组?

Posted

技术标签:

【中文标题】单元重用后如何恢复CAAnimation组?【英文标题】:How to resume the CAAnimation group after cell reuse? 【发布时间】:2019-01-09 10:48:42 【问题描述】:

我在 Cell 中编写了一些 CAAnimation 代码。它在细胞的第一场演出中正常工作。但经过细胞重用。动画停止。几乎所有的方式在互联网上。它删除动画并再次添加。但我希望我能得到动画并再次恢复。有人知道怎么做吗?感谢您的帮助。

我还发现苹果提供了一种停止和恢复 CAAnimation 的方法。但它似乎在我的项目中不起作用,只使用简历代码。 这是行。 QA1673

我使用 CAAnimationDelegate 来查看动画状态。当单元格滚动出界时,他们调用- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag 告诉动画停止。所以苹果阻止它不是偶然的。

这就是我得到的所有信息。

【问题讨论】:

你把你的动画放在哪里?也许你应该把它放在willDisplayCell 函数中。 - (void)awakeFromNib。但我将 CAAnimation 设置为永远重复。 awakeFromNib 中创建CAAnimation 对象但将其添加到prepareForReuse 中的图层怎么样? 如果您在 prepareForReuse 中添加它。单元格在第一次时不会有任何动画。 prepareForReuse 只有在单元格再次使用时才调用它。 【参考方案1】:

正如您所发现的,单元格的awakeFromNib 只为一个单元格调用一次,即使它可能会被重复使用多次。我建议将您的代码如下:

UITableViewCell 或子类中

- (void)awakeFromNib 在单元格的生命周期内调用一次。 放置与单元格内容独立的初始化代码。

- (void)prepareForReuse 当单元即将被重新循环时调用。 将在重用单元格之前必须调用的清理代码放在此处。通常你不需要使用这个,但可以将代码放在cellForRowAtIndexPath 中。见下文。

在课堂上实现UITableViewDataSource

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 为表格视图要显示的每个单元格调用。 将与单元格内容相关的初始化代码放在这里。我建议你把你的动画代码放在这里。

【讨论】:

感谢您的帮助。但我不想将动画视图显示给视图控制器。我也认为将动画代码放在控制器中是不对的。现在我在 '- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier' 函数中添加动画代码。当细胞被重复使用时。我用钥匙检查动画是否存在。如果已经有了。删除并再次添加。它的工作方式可能不是一种智能的方式。 @Huanrong 如果需要,您可以将动画特定代码保留在单元类中,只需将其放入您从cellForRowAtIndexPath 调用的函数中即可。 但是我认为你会在一个单元格中添加太多的CAAnimation,在你使用一段时间之后。我们将动画设置为永远重复,它们不会自动删除。 嗯,我不确定我看到了区别。如果您将configureAnimation 函数添加到您的单元格类,则该函数可以检查动画是否已经存在,如果存在则将其删除,然后最后添加它。这将与您当前的解决方案具有相同的结果,但有利于将动画特定代码保留在单元类中的一个函数中。当然,您当前的解决方案也可以。 好的。我使用的方式不需要让控制器知道什么时候开始动画。但是将动画代码放在哪里不是我的问题。其实我想知道细胞重用后发生了什么。为什么动画停止以及是否有办法让它重新开始。我不想在重用之前删除并再次添加它。?

以上是关于单元重用后如何恢复CAAnimation组?的主要内容,如果未能解决你的问题,请参考以下文章

如何找回文件系统变没硬盘的数据

线上故障突突突?如何紧急诊断排查与恢复

如何从XPages / dojo中的“超时超时”中恢复

如何正确的对安卓手机进行数据恢复?

如何保存和恢复作为音频单元主机的音频单元状态

如何使 UIPageViewController 像 tableview 重用单元一样重用控制器?