【问题标题】:iPhone UITableView Add content at the top without scrollingiPhone UITableView 在顶部添加内容而不滚动
【发布时间】:2011-12-17 17:46:10
【问题描述】:

我在 UITableView 中有一个可能很长的消息滚动日志用户将能够通过滚动来导航表格。

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

我这样做是为了防止表格滚动到顶部中断用户浏览数据。如果我要求表格简单地滚动到新的插入点,则用户在表格中的位置将会丢失,让用户感到沮丧。

我可以尝试实现这一点的方法之一是将数据插入到索引 0 处的 NSMutableArray。这可行吗? 一个额外的问题:在 NSMutableArray 的开头插入数据的成本是多少.我希望这样的操作得到优化,但想确定一下。这个实现我缺少什么?

谢谢!

【问题讨论】:

标签: iphone objective-c uitableview uiscrollview ios5


【解决方案1】:

如何在不碰撞视图的情况下插入:

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

如何避免在用户拖动时导致问题:

  • 跟踪用户拖动的时间,如果您想在拖动/移动期间插入行,请将它们添加到用户释放后执行的队列中。

【讨论】:

  • 某事告诉我,这必须用 [tableView beginUpdates] 和 [tableView endUpdates] 包围才能无缝工作。我说的对吗?
  • 我不相信,虽然我什至没有使用过那些方法。尝试不使用,看看会发生什么。
  • 不使用 InsertCell,而是将单元格的高度添加到保存的偏移量中。最后,重新加载数据并更新到保存的偏移量。另见:stackoverflow.com/questions/4279730/…
  • 我尝试了上述相同的逻辑,但不起作用。我正在使用自动布局。此外,如果重新加载数据后内容插入发生变化,上述逻辑将不起作用。就像在聊天应用程序中一样。
【解决方案2】:
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;

【讨论】:

    【解决方案3】:

    刚刚在这里发布了一个带有代码 sn-ps 的答案

    Keep uitableview static when inserting rows at the top

    基本上:

    • 将滚动偏移量保存在您将调用 beginUpdate: 的位置。
    • 您可以将单元格的高度添加到保存的偏移量中,而不是调用 InsertCell。
    • 在您应该调用 endUpdate: 的地方,调用 reloadData,然后滚动保存的偏移量,没有动画。

    【讨论】:

      猜你喜欢
      • 2011-01-21
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 2012-04-04
      相关资源
      最近更新 更多