嗨,我想在scrollview上动态增加tableview高度。我将尝试以下代码也无法正常工作
这里的项目是tableview数据数组
override func viewDidLoad() {
super.viewDidLoad()
rewardPointsApi()
if(items != nil) {
self.tableviewheight.constant = CGFloat(70*items.count)
}
tableviewheight.constant = tableview.contentSize.height
}
有时设置带有tableView的内容大小的常数不会正确更新高度,因为tableView正在重新加载或计算自
最好的地方是什么?
如果您有静态数据,那么viewDidAppear
可能是最好的地点
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.view.layoutIfNeeded()
self.heightConstraint.constant = self.tableView.contentSize.height
self.view.layoutIfNeeded()
}
如果您的数据是动态的,例如调用API。然后在主队列内的响应块内。
DispatchQueue.main.async {
self.tableView.reloadData()
self.view.layoutIfNeeded()
self.heightConstraint.constant = self.tableView.contentSize.height
self.view.layoutIfNeeded()
}
重要:直接与内容大小重要的因素为 estimateRowHeight
,因此,如果您确定单元格的高度,则直接在静态行数时直接应用
希望这对您和面临同一问题的其他人有帮助
在从API 获得响应后,使用以下代码,首先将数据分配给项目数组,然后重新加载表视图并设置UItableview
的高度约束并禁用tableView自滚动查看以下代码。
if(items != nil)
{
DispatchQueue.main.async {
tableView.reloadData()
tableviewheight.constant = tableview.contentSize.height
tableView.isScrollEnabled = false
self.view.layoutIfNeeded()
}
}
当前您在rewardPointsApi()
之后立即上方写作,如果您正在等待此方法的响应,则您的逻辑将有效,如果其异步请求您的代码不起作用。您需要在重新加载数据后立即添加rewardPointsApi()
的响应中的以下行。
tableviewheight.constant = tableview.contentSize.height
在委托方法集合中,约束的高度查看内容大小
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
self.constraint_height.constant = self.tblview.contentSize.height
}
重新加载后,如果需要时,请在需要时查看布局
self.tblview.reloadData()
self.view.layoutIfNeeded()
self.constraint_height.constant = self.tblview.contentSize.height
self.view.layoutIfNeeded()