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

时间:2018-01-31 08:58:35

标签: ios uitableview

我正在开发一个必须支持000条记录的UITableView实现。我一直在利用UITable InsertRows,DeleteRows和MoveRows来根据需要随机播放记录。 在性能方面,当仅使用插入/删除时,这一切都很好。 我发现MoveRows具有滚动表的不良副作用,试图将任何移动的行保留在表的可见区域中。 当你有数千条记录时,这可能导致表扫描大量单元格,从而需要加载。

我尝试过各种技巧,例如禁用滚动,试图阻止内容偏移的变化 - 但收效甚微。

一种解决方法是放弃MoveRow,并用InsertRow / DeleteRow对替换它。这确实有效,但是以脱节动画为代价,更重要的是失去行选择。

有人可以推荐一种已知具有所需效果的技术吗?

====更新====

我提到了一点点成功'。我所取得的成功是观察到ContentOffset ContentOffset{0,0}时表格未尝试重新定位ContentOffset = {0,0}。 所以,我的黑客是移动到ContentOffset没有动画,批量更新,然后恢复MoveRow。看来该表预先计算它是否会重新定位,在实际var contentOffset = _table.ContentOffset; _table.PerformBatchUpdates(() => { _table.MovRows(...); }); _table.SetContentOffset(contentOffset, false); 调用内的某处。所以 - 我可以快速将偏移移动到零并再次返回,而不会让用户看到它。然后该表开始动画。

e.g。

AVPlayerViewController

1 个答案:

答案 0 :(得分:0)

在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
        }
 })