我在UIScrollView
里面有UITableView
。从服务器获取一些数据后,我重新加载了表视图,然后我获得了表视图内容高度并将表视图的高度更改为该内容高度并在scrollView
上调用layoutIfNeed()
。
但问题是,当重新加载tableView
后的访问时,contentHeight 不正确,但如果在一秒后访问,它会给出正确的高度。有没有办法在不等待几秒钟的情况下获得正确的高度。
self.tableView.reloadData()
self.tableViewHeight.constant = self.tableView.contentSize.height
self.containerSV.layoutIfNeeded()
reload
正确后,只有在加载所有单元格后,contentSize
才可用。您可以使用Key Value Observing
来观察内容大小的变化。
// register observer
tableView.addObserver(self, forKeyPath: "contentSize", options: [.new, .old, .prior], context: nil)
@objc override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "contentSize" {
// content size changed
}
}
您可以通过执行以下操作在不使用 KVO 的情况下获得正确的内容大小:
self.tableView.reloadData()
DispatchQueue.main.async {
self.tableViewHeight.constant = self.tableView.contentSize
self.containerSV.layoutIfNeeded()
}
由于主队列是串行的,因此获取 contentSize 的任务仅在重新加载表视图完成后执行。