7

我在滚动顶部时插入 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 之后,但它显示快速混蛋,因为它会将您带到 Table 顶部,然后突然将其滚动到您的最后一个位置。

我怎样才能使它顺利。

谢谢

4

1 回答 1

9

我还没有对此进行详尽的测试,但这似乎很有希望:

  1. 识别NSIndexPath可见细胞之一。
  2. 得到它的rectForRowAtIndexPath.
  3. 获取当前contentOffset表本身。
  4. 添加该部分,但调用reloadData而不是insertSections(这可以防止不和谐的滚动)。
  5. 获取您在步骤 2 中获得的更新rectForRowAtIndexPath
  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
于 2013-08-10T19:14:08.017 回答