获取TableView的正确ContentSize.height

时间:2018-02-03 07:02:17

标签: swift uiscrollview autolayout tableview nslayoutconstraint

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

但问题是,重新加载tableView后访问时contentHeight不正确,但如果访问一秒后它正在给出正确的高度。有没有办法在不等几秒钟的情况下获得正确的高度。

self.tableView.reloadData()
self.tableViewHeight.constant = self.tableView.contentSize.height
self.containerSV.layoutIfNeeded()

2 个答案:

答案 0 :(得分:4)

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 } } 来观察内容大小的变化。

foreach (GridDataItem item in mygrd.SelectedItems) { 
    if(item["column1"] != ”somethingSpecific”)
        //Do Something with item 
}

答案 1 :(得分:0)

您可以在不使用KVO的情况下通过以下方法获得正确的contentSize:

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

由于主队列是并发的,因此只有在重新加载tableview完成后,才会执行将contentSize赋给它的任务。