UITableView在滚动时插入顶部

Man*_*ann 7 uitableview ios

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

      [_mainTable beginUpdates];
      [_mainTable insertSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
      [_mainTable endUpdates];
Run Code Online (Sandbox Code Playgroud)

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

[_mainTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:1] atScrollPosition:UITableViewScrollPositionBottom animated:NO];
Run Code Online (Sandbox Code Playgroud)

在endUpdates之后,它会显示快速的混蛋,因为它会将你带到桌面顶部然后突然滚动到你的最后位置.

我怎样才能让它变得流畅.

谢谢

Rob*_*Rob 9

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

  1. 识别NSIndexPath其中一个可见细胞.
  2. 得到它rectForRowAtIndexPath.
  3. 获取contentOffset表格的当前信息.
  4. 添加部分,但调用reloadData而不是insertSections(这可以防止滚动).
  5. 获取rectForRowAtIndexPath您在第2步中获得的更新.
  6. contentOffset通过步骤5和步骤2的结果的差异进行更新.

从而:

[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
Run Code Online (Sandbox Code Playgroud)