几天来我一直在为此苦苦挣扎,希望有人能提供帮助。
我的结构看起来像这样:
UIView
|---UIScrollView
|---UIContentView
|---UIHeaderView
|---UITableView
|---UITCollectionView
我在 Interface Builder 中将高度和约束设置为0(出于测试目的,我也很讨厌将其设置为3600),并且然后运行 for循环以获取UIContentView中所有视图的高度,在加载所有子视图之后:
override func viewDidLayoutSubviews() {
var contentRect = CGRect.zero
for view in contentView.subviews {
contentRect = contentRect.union(view.frame)
}
contentHeightConstraint.constant = contentRect.height
}
当我 retrieveData 和 retrieveImages FromFirebase时,我还调用一种方法来重新加载表并更新 cellForRowAt indexPath 上的子视图:
func configureTableView() {
self.postTableHeightConstraint.constant = postTableView.contentSize.height
postTableView.reloadData()
postTableView.layoutSubviews()
postTableView.layoutIfNeeded()
}
我的 Autolayout 设置正确,因为所有内容都能滚动并看起来正确,但是由于某种原因,它无法创建足够的滚动区域,就好像它仅加载了所需滚动空间的75%一样。我的contentView。
好像我用 Interface Builder
中设置为占位符的值覆盖了 viewDidLayoutSubViews 中计算的值一样。我已经尝试了所有这些方法:
似乎没人在工作,我想念什么?
答案 0 :(得分:0)
为解决此问题,我将 viewDidLayoutSubviews()代码移到了新的自定义方法中,并在每次完成 configureTableView()方法
时都调用了它func calcTotalHeight() {
for view in contentView.subviews {
self.contentRect = self.contentRect.union(view.frame)
}
contentHeightConstraint.constant = self.contentRect.height
contentView.needsUpdateConstraints()
}
func configureTableView() {
//1. Set Table Row dimensions
postTableView.rowHeight = UITableViewAutomaticDimension
postTableView.estimatedRowHeight = 375
//2. Update Table View and reload contentview
postTableView.reloadData()
contentView.layoutIfNeeded()
//3. Update Table View Height
self.postTableHeightConstraint.constant = postTableView.contentSize.height
//4. Reload ContentView and Recalculate New Height of Content View
contentView.layoutSubviews()
calcTotalHeight()
}
不是最有说服力的解决方案,但它可以工作,并且不会在加载时产生过多开销。
同样重要的是,要指出,相对于其他代码而言,reloadData,layoutIfNeeded和layoutSubviews相对于其他代码的顺序在使此功能正常工作中起着至关重要的作用。