UITableView在滚动时插入顶部

时间:2013-08-10 17:25:14

标签: ios uitableview

我在滚动顶部时插入UITableView的新部分(包含3个单元格)。

      [_mainTable beginUpdates];
      [_mainTable insertSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
      [_mainTable endUpdates];

部分正确插入。但它需要我的表顶部,即单元格0或行0.我希望此事务顺利。我可以插入

[_mainTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:1] atScrollPosition:UITableViewScrollPositionBottom animated:NO];
在endUpdates之后

但它显示了快速的混蛋,因为它会将你带到桌面顶部,然后突然将其滚动到你的最后位置。

我怎样才能让它顺利进行。

谢谢

1 个答案:

答案 0 :(得分:9)

我没有对此进行详尽的测试,但这看起来很有希望:

  1. 识别其中一个可见单元格的NSIndexPath
  2. 获取rectForRowAtIndexPath
  3. 获取表格的当前contentOffset
  4. 添加该部分,但请拨打reloadData而不是insertSections(这样可以防止出现震动)。
  5. 获取您在第2步中获得的更新rectForRowAtIndexPath
  6. 根据步骤5和步骤2的结果差异更新contentOffset
  7. 因此:

    [self.sections insertObject:newSection atIndex:0];  // this is my model backing my table
    
    NSIndexPath *oldIndexPath = self.tableView.indexPathsForVisibleRows[0];    // 1
    CGRect before = [self.tableView rectForRowAtIndexPath:oldIndexPath];       // 2
    CGPoint contentOffset = [self.tableView contentOffset];                    // 3
    [self.tableView reloadData];                                               // 4
    NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:oldIndexPath.row inSection:oldIndexPath.section + 1];
    CGRect after = [self.tableView rectForRowAtIndexPath:newIndexPath];        // 5
    contentOffset.y += (after.origin.y - before.origin.y);
    self.tableView.contentOffset = contentOffset;                              // 6