UIView.animate(withDuration: 0, animations: {
self.tableView.layoutIfNeeded()
}) { (complete) in
var heightOfTableView: CGFloat = 0.0
// Get visible cells and sum up their heights
let cells = self.tableView.visibleCells
for cell in cells {
heightOfTableView += cell.frame.height
}
// Edit heightOfTableViewConstraint's constant to update height of table view
self.heightOfTableViewConstraint.constant = heightOfTableView
}
UIView.animate(withDuration: 0, animations: {
self.tableView.layoutIfNeeded()
}) { (complete) in
var heightOfTableView: CGFloat = 0.0
// Get visible cells and sum up their heights
let cells = self.tableView.visibleCells
for cell in cells {
heightOfTableView += cell.frame.height
}
// Edit heightOfTableViewConstraint's constant to update height of table view
self.heightOfTableViewConstraint.constant = heightOfTableView
}
在这个代码块中:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
...
if indexPath.row == data.count-1{
// Insert the code here
}
return cell
}
UIView.animate(withDuration: 0, animations: {
self.tableView.layoutIfNeeded()
}) { (complete) in
var heightOfTableView: CGFloat = 0.0
// Get visible cells and sum up their heights
let cells = self.tableView.visibleCells
for cell in cells {
heightOfTableView += cell.frame.height
}
// Edit heightOfTableViewConstraint's constant to update height of table view
// Set tableView's constraint to height + 1 so that
// it can still draw the next visible cell it's supposed to.
self.heightOfTableViewConstraint.constant = heightOfTableView + 1
}
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
//Get the height required for the TableView to show all cells
if indexPath.row() == (tableView.indexPathsForVisibleRows.last! as! NSIndexPath).row {
//End of loading all Visible cells
float heightRequiredForTable = tableView.contentSize.height
//If cell's are more than 10 or so that it could not fit on the tableView's visible area then you have to go for other way to check for last cell loaded
}
}
9条答案
按热度按时间ltskdhd11#
最后,我想出了一个解决方案:
tableView.contentSize.height
不适用于动态单元格,因为它们只返回单元格的数量 *estimatedRowHeight
。因此,要获得动态表视图高度,您需要查找所有可见的单元格,并将它们的高度相加。请注意,这只适用于比屏幕短的表视图。
然而,在我们执行上述操作以查找可见单元格之前,重要的是要知道注意我们需要在屏幕上获得表视图,以便我们可以获得可见单元格。要做到这一点,我们可以为表视图设置一个高度限制,使其显示在屏幕上:
1.设置表视图约束的高度:
1.调用tableView。layoutIfNeeded(),完成后,查找可见的单元格,总结它们的高度,并编辑
heightOfTableViewConstraint
:r9f1avp52#
上面提到的解决方案都很好。我尝试了一种不同的方法&它流畅而清晰地理解。只需复制粘贴代码&它将工作。
g6ll5ycj3#
这个问题已经有答案了,但我也想分享一下我的经验。
我也有同样的问题。我已经搜索了许多类似的问题的答案,并尝试了他们的答案,不工作.
终于找到leonardloo answer了谢谢你,但这并没有解决我的问题。我只想完成他的回答。我把这个代码从他的回答:
在这个代码块中:
这意味着在table中的所有行都被加载之后,我们使用这段代码更新行的高度。它的工作!!!
mkshixfv4#
尽管@leonardloo的答案部分正确,而且可能适合许多人的需求,但我想分享我是如何解决这个问题的。
我有一个大的tableView与大行,并有同样的问题。当我应用@leonardloo的答案时,我发现它只绘制了它在开始时找到的可见单元格的数量,它绘制了1行,而它应该绘制5行(我的数据源计数)。
为了解决这个问题,我找到了一个简单的方法:
这里的要点是让它绘制下一个单元格,以便通过将constraint常量设置为height + 1,它也会被计入visibleCells中。我已经测试过了,它现在看起来像一个魅力。
uelo1irk5#
当你有页眉、页脚、节头之类的东西时,上面的答案不起作用。只使用可见单元格的高度是一个灾难。相反,您可以使用tableView contentSize height。
kuhbmx9i6#
您应该在下面的delegate方法中计算tableView的高度,
ukqbszuj7#
只需维护一个类型为
CGFLoat
的数组,并将UITableViewAutomaticDimension
追加到tableview
的cellForRowAt
indexPath
委托中ssgvzors8#
我将在这里添加我的答案,因为我有点挣扎。
我的表格视图使用了有标题的部分,所以仅仅获取可见单元格的高度是不起作用的。我最后做的是首先为
tableView
设置一个超大的高度,这样内容就都会被添加进去。然后在tableView
的最后一个cell
上,我将tableView
的大小调整为与content
相同的高度。u7up0aaq9#
你可以试试这个代码