为什么UITableView contentOffset在tableview reloadData期间变化很大,而不是保持不变?如何在reloadData之后使其保持不变?

时间:2018-08-06 03:47:01

标签: ios uitableview

我正在浏览互联网,但没有令人满意的结果。我有一个tableView,每次执行reloadData时,其偏移量总是不规则地变化。即使表的内容保持不变,也会发生这种情况。

我放置了一段代码来记录偏移量在使用reloadData运行scrollViewDidScroll时的变化。

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    print ("TABLEVIEW OFFSET : \(scrollView.contentOffset)");
}

我还创建了一个代码,以在reloadData之前保存旧的偏移量,并在延迟后重新设置为新的偏移量。

extension UITableView {

    func reloadDataOffset() {
        print ("OLD OFFSET : \(self.contentOffset)");
        let offset = self.contentOffset;
        let oldHidden = self.isHidden;
        self.isHidden = true;
        self.reloadData();
        delay(1) {
            self.setContentOffset(offset, animated: false);
            self.isHidden = oldHidden;
            print ("NEW OFFSET : \(self.contentOffset)");
        }
    }

}

这就是日志上显示的内容。

OLD OFFSET : (0.0, 314.0)
TABLEVIEW OFFSET : (0.0, -64.0)
TABLEVIEW OFFSET : (0.0, 314.0)
TABLEVIEW OFFSET : (0.0, -64.0)
TABLEVIEW OFFSET : (0.0, 753.0)
TABLEVIEW OFFSET : (0.0, 586.0)
TABLEVIEW OFFSET : (0.0, 753.0)
TABLEVIEW OFFSET : (0.0, 706.0)
TABLEVIEW OFFSET : (0.0, 753.0)
TABLEVIEW OFFSET : (0.0, 751.5)
TABLEVIEW OFFSET : (0.0, 750.0)
TABLEVIEW OFFSET : (0.0, 747.5)
TABLEVIEW OFFSET : (0.0, 744.5)
TABLEVIEW OFFSET : (0.0, 741.0)
TABLEVIEW OFFSET : (0.0, 737.5)
TABLEVIEW OFFSET : (0.0, 733.5)
TABLEVIEW OFFSET : (0.0, 729.5)
TABLEVIEW OFFSET : (0.0, 725.5)
TABLEVIEW OFFSET : (0.0, 721.5)
TABLEVIEW OFFSET : (0.0, 717.5)
TABLEVIEW OFFSET : (0.0, 714.5)
TABLEVIEW OFFSET : (0.0, 711.5)
TABLEVIEW OFFSET : (0.0, 709.0)
TABLEVIEW OFFSET : (0.0, 707.5)
TABLEVIEW OFFSET : (0.0, 706.5)
TABLEVIEW OFFSET : (0.0, 706.0)
TABLEVIEW OFFSET : (0.0, 314.0)
NEW OFFSET : (0.0, 314.0)

我这样做(增加延迟)是因为我在某处读到tableView reloadData发生在不同的线程中,并且每当reloadData完成时我都无法准确获得回调或通知。但是,这看起来很丑陋。我可以删除isHidden = true部分,但这将使表内容看起来跳来跳去。有什么真正的方法可以在reloadData完成后立即将偏移量重置为旧值?或者,有什么方法可以使滚动偏移量在reloadData之前/之后保持在原处?

1 个答案:

答案 0 :(得分:1)

viewDidLoad()中调用此命令后,我终于解决了该问题:

tableView.estimatedRowHeight = 0;
tableView.estimatedSectionHeaderHeight = 0;
tableView.estimatedSectionFooterHeight = 0;

看起来这是iOS 11的一个新的默认“模糊功能”,在我看来,这带来的损害大于帮助。这就是为什么我在iOS 11之前从未遇到过此问题的原因。此估算值弄乱了我的表内容大小和内容偏移量控件。尝试关闭这三个估计,您将看到UITableView不稳定的contentOffsetcontentSize将再次在您的控制下运行。我只是真的希望Apple做出这样的功能,使其在添加时默认为禁用,以免与无法为新更改做好准备的旧代码混淆。