iPhone - UITableViewCell高度变化的平滑动画,包括内容更新

22

可能重复:
当选择单元格时,您可以动画更改UITableViewCell的高度吗?

我有一个表视图,当您点击单元格中的开关时,表视图的许多单元格可能会更改其高度。计算哪些单元格将更改大小有点复杂,因此我不想调用两次相同的代码。

我有一个heightForRowAtIndexPath方法(这是复杂的方法)。

是否有一种方法可以在不影响未更改的特征的情况下动画化单元格的增长或缩小功能?

我尝试了UIView动画,使用带有动画的reloadData进行部分重载,...但我没有找到任何平滑的东西。 我尝试抓住每个将要更改的单元格,并在每个单元格上调用具有动画的reloadData。 它接近工作,但单元格一个接一个地更新。 正如我之前所说,我不想这样做,因为我必须两次调用heightForRowAtIndexPath方法。

我想要的是能够以类似于增长或减少运动的方式动画化每个具有变化高度的单元格,而不是淡入淡出。

你知道怎么做吗? 还有一件事,当大小更改时,单元格的内容会稍微更改(添加了一些文本,背景颜色更改等等)

1个回答

61

UITableView有一个很棒的技巧可以动画地改变单元格高度:如果您向表视图发送一个空更新块,它不会插入或删除任何单元格,但它仍然会重新计算整个表格的单元格高度。因此,即使这段代码看起来很奇怪,它也应该能够实现目标:

[tableView beginUpdates];
[tableView endUpdates];

如果你想要同时改变更新单元格的内容,你需要在更新块中添加一个或多个调用 reloadRowsAtIndexPaths:withRowAnimation: 方法。


完成了。你能再帮我一下吗?我想更新所有的章节,所以我试图调用reloadSections:withRowAnimation。但是我不习惯使用NSIndexSet。在这个调用中,我该如何构建章节列表呢?肯定要在某处调用numberOfSectionsInTableView,但我该如何构建indexSet呢? - Oliver
假设您想要更新第0和第3个部分:NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet]; [indexSet addIndex:0]; [indexSet addIndex:3];。请参阅文档以获取更多信息。 - Ole Begemann
可以,谢谢你。但是当我改变单元格的背景颜色时,会有图形伪影。是否有办法在调整大小动画结束后仅更新单元格内容? - Oliver
似乎在iOS 10上出现了故障。 - Sam
这在iOS 16上不再有效。自iOS 10以来可能就已经损坏了。 - förschter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接