iOS-tableHeaderView利用自动布局自适应高度

效果:

关键点0:

headerView的子View的布局一定要从headerView的最上面开始填充,然后依次往下面设置布局

private func setupSubViews(){
        topView = UIView()
        topView.backgroundColor = YZJRandomColor()
        addSubview(topView)
        topView.snp.makeConstraints { (make) in
            make.left.right.top.equalTo(self)
            make.height.equalTo(99)
        }
        
        middleView = UIView()
        middleView.backgroundColor = YZJRandomColor()
        addSubview(middleView)
        middleView.snp.makeConstraints { (make) in
            make.top.equalTo(topView.snp.bottom)
            make.left.right.equalTo(self)
            make.height.equalTo(103)
        }
        
        bottomView = UIView()
        bottomView.backgroundColor = YZJRandomColor()
        addSubview(bottomView)
        bottomView.snp.makeConstraints { (make) in
            make.top.equalTo(middleView.snp.bottom)
            make.left.right.equalTo(self)
            make.height.equalTo(129)
        }
}

关键点1:

第一次显示的时候,需要在headerView类的didMoveToSuperview里面设置布局(宽度的布局一定要设置)

override func didMoveToSuperview() {
        super.didMoveToSuperview()
        if superview != nil{
            snp.remakeConstraints { (make) in
                make.width.equalTo(superview!)
                make.bottom.equalTo(bottomView)
            }
            layoutIfNeeded()
        }
}

关键点2:

headerView布局修改后需要调用superview?.layoutIfNeeded(),并重新赋值tableViewtableHeaderView

        topView.snp.remakeConstraints { (make) in
            make.left.right.top.equalTo(self)
            make.height.equalTo(randomHeight())
        }
        middleView.snp.remakeConstraints { (make) in
            make.top.equalTo(topView.snp.bottom)
            make.left.right.equalTo(self)
            make.height.equalTo(randomHeight())
        }
        
        bottomView.snp.remakeConstraints { (make) in
            make.top.equalTo(middleView.snp.bottom)
            make.left.right.equalTo(self)
            make.height.equalTo(randomHeight())
        }
        superview?.layoutIfNeeded()
        headerView.change()
        tableView.tableHeaderView = headerView

关键点3(iOS9会有影响):

  • 使用自动布局的时候先设置tableView的布局再给tableView.tableHeaderView赋值
        tableView.snp.makeConstraints { (make) in
            make.edges.equalTo(view)
        }
        tableView.tableHeaderView = headView
  • headerView里面只能有一个外包的容器View,不能容器View再套容器View进行自适应(外部的容器View布局依赖于里面容器View的布局)

demo地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 项目里的布局一直都是纯代码流,顺带着Autolayout也一直没有使用,直到遇到了masonry,让我看到了希望,...
    小笨狼阅读 13,080评论 25 128
  • 沉沉 像与昨夜有关 粑粑,麻麻,老家新盖的房子,还有流水,有交流,有和麻麻一起骑一辆自行车涉水过滩涂的时刻~ 还好...
    北边的杉阅读 3,056评论 0 5
  • 前言: 作为一个内地人,一直很向往沿海城市。 或多或少有些少男少女的情怀,想要逃离熟悉的土木山石。总觉得要出去闯一...
    Winjameoooboom阅读 1,639评论 0 0
  • kidII阅读 1,522评论 0 0
  • 曾经,也爱写点什么的我,蠢蠢欲动,想把自己的内心世界记录下来,总是没有找到合适的软件,一而再再而三地耽误了。这么多...
    戈壁红柳gbhl阅读 1,787评论 2 1

友情链接更多精彩内容