单元重用后如何恢复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组?的主要内容,如果未能解决你的问题,请参考以下文章