Ios UITableView滚动时在顶部插入节

Ios UITableView滚动时在顶部插入节,ios,uitableview,Ios,Uitableview,在滚动顶部时,我正在UITableView的顶部插入新的部分(部分包含3个单元格) [_mainTable beginUpdates]; [_mainTable insertSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone]; [_mainTable endUpdates]; 节正确插入。但它把我带到了表格的顶部,即单元格0或行0。我希

在滚动顶部时,我正在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之后,它会显示quick jerk,因为它会将您带到桌面顶部,然后突然将其滚动到您的最后一个位置

我怎样才能使它光滑


谢谢

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

  • 识别其中一个可见单元格的
    nsindepath
  • 获取其
    rectforrowatinexpath
  • 获取表本身的当前
    contentOffset
  • 添加节,但调用
    reloadData
    ,而不是
    insertSections
    (这可以防止不和谐的滚动)
  • 获取在步骤2中得到的更新的
    rectforrowatinexpath
  • 根据步骤5和步骤2的结果的差异更新
    contentOffset
  • 因此:


    非常感谢你,伙计。虽然上面的代码很有魅力,但就我个人的理解而言,我并没有得到第5点。为什么我们这里需要旧的长方形?如果你能澄清,我将非常感激it@mann我只是想看看其中一行向下移动了多少。因此,我在插入之前和之后获取可见行的rect,然后使用
    y
    值之间的差异来调整
    contentOffset
    的值,使行显示在与之前相同的位置。哇,非常感谢,刚刚找到了这个,这正是我需要的。谢谢再次感谢。不确定这是否有助于其他人,但这里有一些额外的注释,帮助我://1获取屏幕上最上面可见行的索引路径(节,行)//2确定该行向下的距离//3在列表中向下滚动的距离//4.5(newIndexPath行)确定刷新后行的索引路径(节,行)。假设:上面只添加了一个部分,对现有部分没有新的更新//5新行到底有多远//6更新contentOffset以将tableview向下移动到故事现在所在的位置
    [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