【问题标题】:UITableView inserting section at top while scrollingUITableView 在滚动时在顶部插入部分
【发布时间】:2026-02-04 22:50:01
【问题描述】:

我在滚动顶部时插入 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 顶部,然后突然将其滚动到您的最后一个位置。

我怎样才能使它顺利。

谢谢

【问题讨论】:

    标签: ios uitableview


    【解决方案1】:

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

    1. 识别NSIndexPath 的可见单元格之一。
    2. 获取其rectForRowAtIndexPath
    3. 获取表本身的当前contentOffset
    4. 添加该部分,但调用 reloadData 而不是 insertSections(这样可以防止不和谐的滚动)。
    5. 获取您在第 2 步中获得的更新后的rectForRowAtIndexPath
    6. 根据第 5 步和第 2 步结果的差异更新contentOffset

    因此:

    [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
    

    【讨论】:

    • 非常感谢你,伙计。我为此苦苦挣扎了很久。
    • 虽然上面的代码就像魅力一样,但就我个人的理解而言,我没有得到第 5 点。为什么我们需要旧矩形?如果您清除它,我将非常感谢
    • @mann 我只是想看看其中一个可见行向下移动了多少。因此,我在插入之前和之后再次获得可见行的矩形,然后使用y 值之间的差异来调整contentOffset 应该使该行出现在与以前相同的位置。
    • 哇,非常感谢,刚刚找到这个,正是我需要的。谢谢!
    • 再次感谢。不确定这是否对其他人有帮助,但这里有一些对我有帮助的附加评论:// 1 获取屏幕上 TOP 可见行的索引路径(部分、行)// 2 确定该行向下有多远 // 3 如何您在列表中向下滚动很远 // 4.5(newIndexPath line) 确定刷新后行的索引路径(section, row)。假设:上面只添加了一个部分,现有部分没有新的更新 // 5 新行向下有多远 // 6 更新 contentOffset 以将 tableview 向下移动到故事现在的位置
    最近更新 更多