我正在浏览互联网,但没有令人满意的结果。我有一个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之前/之后保持在原处?
答案 0 :(得分:1)
在viewDidLoad()
中调用此命令后,我终于解决了该问题:
tableView.estimatedRowHeight = 0;
tableView.estimatedSectionHeaderHeight = 0;
tableView.estimatedSectionFooterHeight = 0;
看起来这是iOS 11的一个新的默认“模糊功能”,在我看来,这带来的损害大于帮助。这就是为什么我在iOS 11之前从未遇到过此问题的原因。此估算值弄乱了我的表内容大小和内容偏移量控件。尝试关闭这三个估计,您将看到UITableView
不稳定的contentOffset
或contentSize
将再次在您的控制下运行。我只是真的希望Apple做出这样的功能,使其在添加时默认为禁用,以免与无法为新更改做好准备的旧代码混淆。