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!
}
}
}
}
补充一下,也许最好在您的 viewWillDisappear
或 deinit
方法中删除该观察者。
我理解你想要计算的问题 动态table 高度 flexible cells height inside tableview 并且根据这个高度你想更新你的parent scrollview contentSize 身高.
我想告诉你,请删除你所有的身高计算,把这个简单函数下面放在你的视图控制器.
重要:-不要给你的table视图任何高度限制 如果您从故事板或以编程方式使用 AutoLayout。
请注意您的 tableview 和 scrollview 的变量名称并分别替换它们 .
//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
滚动视图中有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
欢迎使用 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!
}
}
}
}
补充一下,也许最好在您的 viewWillDisappear
或 deinit
方法中删除该观察者。
我理解你想要计算的问题 动态table 高度 flexible cells height inside tableview 并且根据这个高度你想更新你的parent scrollview contentSize 身高.
我想告诉你,请删除你所有的身高计算,把这个简单函数下面放在你的视图控制器.
重要:-不要给你的table视图任何高度限制 如果您从故事板或以编程方式使用 AutoLayout。
请注意您的 tableview 和 scrollview 的变量名称并分别替换它们 .
//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