我在上网,但没有令人满意的结果。我有一个
tableView
,每当我这样做时,它的偏移量总是不稳定地变化
reloadData
. 即使表的内容保持不变,也会发生这种情况。
我放了一个代码来记录运行时偏移量的变化
重新加载数据
使用
scrollViewDidScroll
.
func scrollViewDidScroll(_ scrollView: UIScrollView) {
print ("TABLEVIEW OFFSET : \(scrollView.contentOffset)");
}
我还创建了一个代码来保存重新加载数据之前的旧偏移量,并在延迟之后重新设置为新偏移量。
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重载数据发生在不同的线程中,并且每当重载数据完成时,我不能确切地得到回调或通知。但这看起来很难看。我可以移除
isHidden = true
部分,但这会使表内容看起来跳跃。有没有什么真正的方法可以在重载数据完成后立即将偏移量重新设置为旧值?或者,有什么方法可以使滚动偏移在重新加载数据之前/之后保持不变?