代码之家  ›  专栏  ›  技术社区  ›  Brewski

在滚动视图中设置ContentView高度以动态更改

  •  0
  • Brewski  · 技术社区  · 6 年前

    我已经为此挣扎了好几天了,我希望有人能帮助我。

    我的结构如下:

    UIView
    |---UIScrollView
        |---UIContentView
            |---UIHeaderView
            |---UITableView
            |---UITCollectionView
    

    我设定我的 高度 还有我的 约束条件 界面生成器 然后我运行一个 for循环 获取uiContentView中所有视图的高度 加载所有子视图后 :

    override func viewDidLayoutSubviews() {
        var contentRect = CGRect.zero
    
        for view in contentView.subviews {
            contentRect = contentRect.union(view.frame)
        }
        contentHeightConstraint.constant = contentRect.height
    }
    

    我还调用了一个方法来重新加载表并更新子视图 索引路径处的单元格 当我 检索表 检索图像 FromFirebase:

    func configureTableView() {
    
        self.postTableHeightConstraint.constant = postTableView.contentSize.height
    
        postTableView.reloadData()
        postTableView.layoutSubviews()
        postTableView.layoutIfNeeded()
    
    }
    

    我的 自动删除 是正确设置的,因为所有内容都会滚动并看起来正确,但由于某种原因,它没有创建足够的滚动区域,这就好像它只加载了ContentView中所需可滚动空间的75%左右。

    就好像它覆盖了它计算的值 视图diDrayOutSubview 我把那些放在 界面生成器

    我尝试过所有这些方法:

    1. 设置 高度限制 内容视图 =内容矩形高度
    2. 设置 高度限制 滚动视图 =内容矩形高度
    3. 设置 高度限制 表视图 =内容矩形高度
    4. 试用C 合并 上述

    似乎没有人在工作,我错过了什么?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Brewski    6 年前

    为了解决这个问题,我移动了我的 ViewDidLayoutSubviews()。 代码转换为新的自定义方法,并在每次完成 可配置视图() 方法

    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和layoutSubview相对于其他代码的顺序在实现这一点上起着关键作用。