iPhone UITableView无需滚动即可在顶部添加内容

时间:2011-10-29 05:22:18

标签: iphone objective-c uitableview uiscrollview ios5

我在UITableView中有一个可能非常长的消息滚动日志用户可以通过滚动来导航表。

我要做的是在表格的顶部添加新内容。如果表格的顶部是可见,则新行会将其余内容向下推送。但如果表格的第一行不可见,则表格会静默添加另一行而不滚动。

我这样做是为了阻止表格滚动到顶部来中断用户浏览数据。如果我要求表格只是滚动到新的插入点,那么用户在表格中的位置就会丢失,这会让用户感到沮丧。

我可以尝试实现这一点的方法之一是将数据插入索引为0的NSMutableArray。这会有用吗?一个额外的问题:在NSMutableArray开头插入数据有多昂贵。我希望这样的操作得到优化,但我想确保。我对此实现缺少什么?

谢谢!

3 个答案:

答案 0 :(得分:13)

如何插入而不会碰到视图:

  • 使用tableView的{​​{1}})UIScrollView值来查找用户当前滚动到的位置。
  • 使用contentOffset
  • 在顶部添加新行
  • animated:NO的{​​{1}}更新为用户所在的位置加上行的高度。

如何避免在用户拖动时导致执行此操作的问题:

  • 跟踪用户拖动的时间,如果要在拖动/动作期间插入行,请将它们添加到用户发布后执行的队列中。

答案 1 :(得分:6)

CGSize beforeContentSize = self.tableView.contentSize;
            [self.tableView reloadData];
            CGSize afterContentSize = self.tableView.contentSize;

            CGPoint afterContentOffset = self.tableView.contentOffset;
            CGPoint newContentOffset = CGPointMake(afterContentOffset.x, afterContentOffset.y + afterContentSize.height - beforeContentSize.height);
            self.tableView.contentOffset = newContentOffset;

答案 2 :(得分:2)

刚刚在这里发布了代码片段的答案

Keep uitableview static when inserting rows at the top

基本上:

  • 将滚动偏移保存在您称为beginUpdate的位置:。
  • 代替对InsertCell的调用,您可以将单元格的高度添加到已保存的偏移量中。
  • 您将调用endUpdate :,调用reloadData,然后使用NO动画滚动保存的偏移量。