ios - 如何防止 UITableView 在移动行时滚动

标签 ios uitableview

我正在开发一个必须支持 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/

相关文章:

ios - 如何正确使用 AVPlayer 使其在播放视频前不显示白屏?

ios - 何时使用 viewDidLoad 何时使用 awakeFromNib

iphone - Segues 无法以编程方式工作

ios - 替换代码中的 IBOutlet View

objective-c - 覆盖不使用 UITableView 滚动 - iOS

ios - 即使我们在 Xcode 中有很多 View 和其他设计,xib 也会显示空白框

iphone - ScrollView 中的多个 View 副本

ios 设置 UITableViewCell 的背景

ios - UITableView 标题大小

ios - 使用 reloaddata 时,UITableViewCell 未从 UITableView 中移除