UITableView 在滚动时在顶部插入部分
Posted
技术标签:
【中文标题】UITableView 在滚动时在顶部插入部分【英文标题】:UITableView inserting section at top while scrolling 【发布时间】:2013-08-10 17:25:13 【问题描述】:我在滚动顶部时插入 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 顶部,然后突然将其滚动到您的最后一个位置。
我怎样才能使它顺利。
谢谢
【问题讨论】:
【参考方案1】:我还没有对此进行详尽的测试,但这似乎很有希望:
-
识别
NSIndexPath
的可见单元格之一。
获取其rectForRowAtIndexPath
。
获取表本身的当前contentOffset
。
添加该部分,但调用 reloadData
而不是 insertSections
(这样可以防止不和谐的滚动)。
获取您在第 2 步中获得的更新后的rectForRowAtIndexPath
。
根据第 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 向下移动到故事现在的位置以上是关于UITableView 在滚动时在顶部插入部分的主要内容,如果未能解决你的问题,请参考以下文章
如何滚动uitableview和顶部的部分标题,可见并滚动到
UITableView 在重新加载页面时在单元格顶部显示额外的分隔线
如何在 UITableView 顶部添加一个一起滚动的视图,但在滚动后粘在顶部