我正在开发一个必须支持 000 条记录的 UITableView 实现。我一直在使用 UITable InsertRows、DeleteRows 和 MoveRows 根据需要随机排列记录。 在性能方面,这一切在仅使用插入/删除时运行良好。 我发现 MoveRows 具有滚动表以尝试将任何移动的行保留在表的可见区域中的不良副作用。 当您有数千条记录时,这可能会导致表格扫描,因此需要加载大量单元格。
我尝试了各种技术,例如禁用滚动,试图阻止内容偏移量的变化 - 但收效甚微。
一种解决方法是放弃 MoveRow,并将其替换为 InsertRow/DeleteRow 对。这确实有效,但代价是动画脱节,更重要的是,行选择丢失。
谁能推荐一种已知的技术来达到预期的效果?
====更新====
我提到了“小成功”。我确实取得的成功是观察到如果 ContentOffset
为 {0,0}
,表不会尝试进行 ContentOffset
重新定位。
所以,我的 hack 是移动到没有动画的 ContentOffset = {0,0}
,批处理我的更新,然后恢复 ContentOffset
。表格似乎在实际 MoveRow
调用中的某处预先计算了它是否会重新定位。所以 - 我可以快速将偏移量移动到零并再次返回,而用户看不到它。然后表格开始播放动画。
例如
var contentOffset = _table.ContentOffset;
_table.PerformBatchUpdates(() =>
{
_table.MovRows(...);
});
_table.SetContentOffset(contentOffset, false);
最佳答案
在 Objective c 中你可以这样做......
dispatch_async(dispatch_get_main_queue(), ^{
[UIView performWithoutAnimation:^{
//Your operation on tableview goes here...
});
在swift中你可以这样做
DispatchQueue.async(DispatchQueue.main.async {
UIView.performWithoutAnimation {
//Your tableview operation goes here
}
})
关于ios - 如何防止 UITableView 在移动行时滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48538155/