滚动时取消 UITableView 中的动画

Posted

技术标签:

【中文标题】滚动时取消 UITableView 中的动画【英文标题】:Cancel animations in UITableView while scrolling 【发布时间】:2012-10-09 19:28:50 【问题描述】:

我有点困惑,没有什么可以求助的。我有一个 ios 应用程序,它从服务器获取消息并将其填充到 UITableView 中的单元格中。每次从服务器更新某个对象时,该更新都会触发单元动画。在我们的例子中,我们有一个游戏得分表。如果有人失去一分,他们的单元格将闪烁红色,如果他们获得一分,他们的单元格将闪烁绿色。简单的概念效果很好,我们的用户喜欢反馈。他们不喜欢的是,当他们滚动时,他们看到单元格具有与之相关的随机颜色并在那里停留大约一秒钟。我相信这与细胞被回收的方式有关。我尝试了有关此问题的各种检查,检查单元格是否具有相同的值,手动将颜色设置为白色等,但这些方法都不起作用。

总而言之,我试图仅在单元格处于视图中时才显示动画,而不是在用户滚动 UITableView 时显示动画。有人有什么建议或想法吗?

谢谢

【问题讨论】:

您可以在动画被重用之前取消动画,方法是为您的自定义 UITableViewCell 类在 prepareForReuse 内的动画层上调用 removeAllAnimations 不幸的是,这不起作用。我仍然看到所有颜色各异的单元格。 你是用 Core Animation 还是 UIView 动画做动画?它看起来像[CABasicAnimation animationForKeyPath:@"backgroundColor"]; ... 还是看起来像[UIView animateWithDuration:0.3 animations:^ /* change color */ ]; 我正在使用 UIView 动画。 你为什么不试试看。我认为您不需要取消 UIView 动画。改变动画属性的值就足够了。 【参考方案1】:

发生了什么

由于表格视图重复使用它们的单元格,您最终会重复使用正在刷新的单元格,即使它们不应该刷新。

如何解决

您可以在自定义表格视图单元格上的preprareForReuse:tableView:willDisplayCell:forRowAtIndexPath: 委托方法(如ACB 所述)中将重复使用的单元格恢复为其默认状态。

由于你是用 UIView 动画来做动画的,所以你只需要改变动画属性的值就可以取消动画,回到默认状态。

如果你有 Flash 的用户核心动画

如果动画是使用 Core Animation 完成的,您将在动画层上调用 removeAllAnimations。 (对于闪烁的动画,您可能不会更改图层上的属性,而是告诉动画自动反转。这意味着删除动画会将颜色更改回其原始值。)

【讨论】:

【参考方案2】:

一个选项是删除动画并将willDisplayCell委托方法中的颜色重置为默认颜色。如果这不起作用,您可以按如下方式设置dequeueReusableCellWithIdentifier

NSString *aCellIdentifier = [NSString stringWithFormat:@"%d",indexPath.row];
UITableViewCell *aCell = [tableView dequeueReusableCellWithIdentifier:aCellIdentifier];     

但是,如果您有很多数据要显示,这将是一个问题,因为它会产生内存问题。请注意,在这种情况下,您不会重复使用表格单元格。

【讨论】:

不,那没用。我还想尝试避免使单元格出列,因为我觉得即使我没有太多数据,随着时间的推移,内存问题也会失控。

以上是关于滚动时取消 UITableView 中的动画的主要内容,如果未能解决你的问题,请参考以下文章

单元格中的 UITableView 动画导致平滑滚动中断

当 UITableView 开始滚动时,动画视图

UITableView 滚动时动画单元格

UITableView 单元格折叠动画看起来很糟糕

iPhone通过滑出表格视图来滚动UITableview

为 UITableview 的高度设置动画时,滚动手势识别器保持相同大小