获取TableView的正确ContentSize.height

3

我在UIScrollView中放置了一个UITableView。从服务器获取一些数据后,我重新加载了tableview,并获取了tableview的内容高度,然后将tableView的高度更改为该内容高度,并在scrollView上调用layoutIfNeed()

但问题在于,当重新加载tableView后,访问contentHeight时它并不正确,但如果稍等一秒钟再访问,就会给出正确的高度。有没有办法在不等待几秒钟的情况下获取正确的高度。

self.tableView.reloadData()
self.tableViewHeight.constant = self.tableView.contentSize.height
self.containerSV.layoutIfNeeded()
2个回答

7

reload之后,正确的contentSize只有在所有单元格都加载完毕后才可用。您可以使用键值观察来观察内容大小的变化。

// 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
    }
}

太棒了!我寻找这个已经好几年了! - Ahmadreza

1

你可以通过以下方式获取正确的contentSize,而无需使用KVO:

self.tableView.reloadData()
DispatchQueue.main.async {
   self.tableViewHeight.constant = self.tableView.contentSize
   self.containerSV.layoutIfNeeded()
}

由于主队列是串行的,获取contentSize的任务只有在重新加载tableview完成后才会执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接