添加具有行动画的单元格时,将 tableview 保持在相同的滚动位置

Posted

技术标签:

【中文标题】添加具有行动画的单元格时,将 tableview 保持在相同的滚动位置【英文标题】:Keep tableview in same scroll position when adding cells with row animation 【发布时间】:2014-08-08 17:29:29 【问题描述】:

我的应用中有一个表格视图,其中显示了日历项目列表。当一个单元格被选中时,我已经设置了在基于时间的表格视图中显示所有日历项目的功能。为此,我插入空白单元格来表示未使用的时间。

问题是当我添加单元格时,表格视图会滚动到顶部。我尝试在添加单元格后设置内容偏移,但行动画变得有问题。我知道我可以将新项目添加到数组并调用 reloadData 但这意味着我错过了动画。

例如 我在上午 9:00 有一个小时的会议,在上午 11:00 有一个小时的早午餐。起初,为了便于阅读,它们并排显示。 当我选择上午 11:00 单元格时:

应在上午 9:00 单元格上方添加 8 个空白单元格,以表示我的会议前 8 个小时的空闲时间

应在上午 9:00 到 11:00 之间添加一个空白单元格,以表示我的会议和早午餐之间的空闲时间

早午餐后应添加 13 个空白单元格,以显示一天中最后 13 个空闲时间。

当我开始上午 11:00 早午餐时,单元格是从顶部算起的第二个单元格。当 tableview 展开时,我希望这个单元格保持在其位置,而其他单元格围绕它进行动画处理。会议单元格应向上移出屏幕,为其下方的空白单元格腾出空间。

我试图通过创建一个索引路径数组来添加空白单元格并调用来实现这一点

[_tableView insertRowsAtIndexPaths:blankArray withRowAnimation:UITableViewRowAnimationFade]

然后我计算并设置 tableview 的内容偏移量,以使早午餐单元格保持在同一位置。

问题是当设置内容偏移量时,单元格仍然从顶部开始动画。这意味着为了让早午餐下面的单元格出现,它们必须首先从 tableview 的顶部向下 ping 屏幕导致闪烁。此外,早午餐和会议室分离不顺畅 - 会议室似乎消失了,而不是向上滑出屏幕。

我曾考虑编写自己的 tableview,但这似乎是一项艰巨的任务。

任何允许我添加带有行动画的单元格同时将所选单元格保持在同一位置的解决方案都会有所帮助。

【问题讨论】:

找到了解决方案。不是很优雅,但很有效。我创建所有可见单元格的快照,计算单元格在展开时将具有的帧,然后将快照设置为该帧的动画。完成后,我删除快照,重新加载 tableview 并设置内容偏移量。 这是我的快速回答:***.com/a/40042923/3548469,我认为转换为目标 -C 不会那么困难 【参考方案1】:

ios 6 及更高版本中,如果您为 table view 的 restoreIdentifier 属性赋值,它会尝试保留当前选定的行和第一个可见行。转到您的 main.storyboard 选择 tableView 然后单击 tableviews 身份检查器您将看到一个名为 Restoration ID 的部分将任何内容放在那里。 BOOM MAGIC 它自己工作。

【讨论】:

以上是关于添加具有行动画的单元格时,将 tableview 保持在相同的滚动位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在自定义滑动(而不是滑动删除)单元格(滑动到邮件/短信)中点击一个单元格时删除在其他 TableView 单元格中添加的子视图

如何将 Buttons 、标签等内容添加到展开的 tableView 单元格?

单击 tableview 单元格时滚动到顶部搜索栏控制器

为 iOS 选择 TableView 单元格时视图已更改

当我单击 tableview 单元格时,UITextfield 没有显示文本?

从另一个视图控制器添加单元格时 UITableViewCell 的内容不可见