在ScrollView中设置ContentView高度以动态更改

时间:2018-09-10 19:09:59

标签: ios swift autolayout

几天来我一直在为此苦苦挣扎,希望有人能提供帮助。

我的结构看起来像这样:

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 中计算的值一样。

我已经尝试了所有这些方法:

  1. 设置 contentView = contentRect.height
  2. heightConstraint
  3. 设置 scrollView = contentRect.height
  4. heightConstraint
  5. 设置 tableView = contentRect.height
  6. heightConstraint
  7. 对上述内容进行了c 组合

似乎没人在工作,我想念什么?

1 个答案:

答案 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相对于其他代码的顺序在使此功能正常工作中起着至关重要的作用。