将单元格添加到UITableView的顶部

时间:2011-11-05 22:03:34

标签: iphone ios uitableview

我想在不移动可见单元格的情况下向表格视图中添加行,类似于Twitter for iPhone,Tweetbot和其他几个。到目前为止,我尝试过的每一种方法最终都能实现这一目标,但两者之间却采用了时髦的动画。这是目前的解决方案,它可以移动细胞但最终会停留在同一个地方。

- (void)controllerDidChangeContent:(NSFetchedResultsController*)controller
{
    UITableViewCell *referenceCell;
    if ([self.tableView.visibleCells count] > 0) {
        referenceCell = [self.tableView.visibleCells lastObject];
    }
    CGFloat offset = referenceCell.frame.origin.y - self.tableView.contentOffset.y;

    [self.tableView endUpdates];

    [self.tableView setContentOffset:CGPointMake(0.0, referenceCell.frame.origin.y - offset) animated:NO];
}

3 个答案:

答案 0 :(得分:1)

试试这个:

  1. 将偏移记录到第一个可见单元格
  2. 确保UITableView dataSource已包含新项目的数据。
  3. 使用-insertRowsAtIndexPaths:withRowAnimation:UITableView上致电UITableViewRowAnimationNone。您可以指定要一次插入的所有索引路径。插入的行数必须与新项目的数量相匹配。
  4. 就像之前一样致电-setContentOffset:
  5. 避免在表格视图中调用-beginUpdates-endUpdates-endUpdates会导致原始单元格完成动画。

    似乎insertRowsAtIndexPaths单独可以为单元格设置动画。您可以尝试这样的解决方法:

    for (UITableViewCell *cell in [tableView visibleCells])
    {
      [cell.layer removeAllAnimations];
    }
    

答案 1 :(得分:0)

您可以重新加载数据源,然后立即调用

[tableview selectRowAtIndexPath: animated:NO scrollPosition:<#(UITableViewScrollPosition)#>];

你可能需要获得你可以用

做的当前位置
[[tableview indexPathsForVisibleRows] objectAtIndex:0];

我没有测试过这个,所以我不是百分之百。

答案 2 :(得分:0)

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

Keep uitableview static when inserting rows at the top

基本上:

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