滚动时取消 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 中的动画的主要内容,如果未能解决你的问题,请参考以下文章