获取正确的 ContentSize.height of TableView



我在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 的任务仅在重新加载表视图完成后执行。

最新更新