ScrollView 里面的 TableView ,如何在运行时计算 tableview 的高度?

TableView inside ScrollView , How to calculate tableview height at runtime?

滚动视图中有table视图,完美滚动需要table视图的高度。但是单元格的动态高度和单元格中的多个内容具有动态数据,如图像(使用 kingfisher 库计算图像的高度)和内容(行数为 0)。所以无法计算每个单元格的高度。所以我用它来获取单元格的高度:-

let totalCount = self.itemArray.data1.count + self.itemArray.data2.count
   if totalCount != self.totalHeightOfTable.count {
      //Appending height of cell
       self.tableView.reloadData()
       self.totalHeightOfTable.append(cell.frame.height)
       self.heightOfPost = self.totalHeightOfTable
       if totalCount == self.totalHeightOfTable.count {
          // Call back to get height of tableView
           self.getTotalHeightOfTableView?(self.totalHeightOfTable)
        }
  } 

因为 tableView 在 scrollview 内,我无法动态地或在 运行 时间计算 tableView 的每个单元格的高度。我在 运行 时获得的高度更大,并且 table 视图末尾有一个空白的白色 space。因此 table 视图的总高度总是大于 table 视图中所有单元格的总和。

UI structure attached

您可以通过 taleView.contentSize.height

使用 contentSize 的高度

欢迎使用 Whosebug!

您绝对可以获得 contentSize,并从中获取 tableView 的高度。我一直在用这个方法,每次都有效。

一种方法是添加观察者,如下所示:

tableView.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil)

然后覆盖控制器的方法,observeValue,像这样:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if let obj = object as? UITableView {
        if obj == self.tableView && keyPath == "contentSize" {
            if let newSize = change?[NSKeyValueChangeKey.newKey] as? CGSize {
                let height = newSize.height // <----- your height!
            }
        }
    }
}

补充一下,也许最好在您的 viewWillDisappeardeinit 方法中删除该观察者。

我理解你想要计算的问题 动态table 高度 flexible cells height inside tableview 并且根据这个高度你想更新你的parent scrollview contentSize 身高.

我想告诉你,请删除你所有的身高计算,把这个简单函数下面放在你的视图控制器.

重要:-不要给你的table视图任何高度限制 如果您从故事板或以编程方式使用 AutoLayout

请注意您的 tableviewscrollview 的变量名称并分别替换它们 .

   //MARK:- viewDidLayoutSubviews will call after dynamic height calculation automatically
override func viewDidLayoutSubviews() {
    
    //isScrollEnabled of table view  should be dissable because our table is inside scrollview.
    tableView.isScrollEnabled = false
    
    
    //if above tableView.contentSize.height   not zero and giving acurate value then proceed further and update our parent scroll view contentsize height for height.
    print(tableView.contentSize.height)
    
    
    
    //place some bottom peeding as you want
    let bottomPedding:CGFloat = 30
    
    
    //Finally update your scrollview content size with newly created table height + bottom pedding.
    scrollview.contentSize = CGSize.init(width: scrollview.contentSize.width, height:tableView.contentSize.height + bottomPedding)
    
    
}

如果这可行,那就太好了,休息吧,我们会解决的,您可以随时与我联系。 asrathoreforiphone@gmail.com