美文网首页swiftSwift编程
swift中tableHeaderFooterView高度自动计

swift中tableHeaderFooterView高度自动计

作者: 何以消摇 | 来源:发表于2018-07-19 23:57 被阅读6次

前提

在写页面的时候很多人都喜欢用纯代码编辑,自然而然需要使用到swift布局神器Snapkit这个框架

问题

tableHeaderView(tableFooterView)设置布局却十分麻烦还要设置frame,具体差不多是这个样子:
1、先手动计算出tableHeaderView的frame
2、在设置自己编写的headView为tableHeaderView的子view
3、最后设置布局
但是,大部分时候headV的高度不仅没办法轻易手动计算得到
而且,需要根据内容动态改变的更加麻烦。

解决方案

利用自动布局自动计算出headView的高,再更新tableHeaderView的frame,
在每次headView中的内容发生修改的时候,都更新tableHeaderView的frame
把代码封装一下,给UITableView新增一个扩展,下次直接食用即可
代码如下:

//
//  UITableView+Snp.swift
//
//  Created by shakesVan on 2018/7/19.
//  All rights reserved.
//

import UIKit
import SnapKit

extension UITableView {
    
    /// 设置自动撑开 Header Footer View
    /// - Parameters:
    ///   - headerV: tableView 顶部的view
    ///   - footerV: tableView 底部的view
    public func setupHeaderFooterV(headerV: UIView?, footerV: UIView?) {
        if let headerV = headerV {
            setupHeaderFooterV(&tableHeaderView, contentV: headerV)
        }
        if let footerV = footerV {
            setupHeaderFooterV(&tableFooterView, contentV: footerV)
        }
    }
    
    /// 更新 headerFooterV 的 size
    public func updateHeaderFooterVSize() {
        updateSize(&tableHeaderView)
        updateSize(&tableFooterView)
    }
    /// 设置自动撑开 Header Footer View
    ///
    /// - Parameters:
    ///   - headerFooterV: headerView & FooterView
    ///   - contentV: 内容 (通过约束自动撑开)
    private func setupHeaderFooterV(_ headerFooterV: inout UIView?,
                                    contentV: UIView) {
        let view = UIView()
        view.addSubview(contentV)
        contentV.snp.makeConstraints { (make) in
            make.edges.equalToSuperview()
        }
        headerFooterV = view
        updateSize(&headerFooterV)
    }
    
    /// 更新 headerFooterV 的 size
    ///
    /// - Parameter headerFooterV: 头部尾部的V
    private func updateSize(_ headerFooterV: inout UIView?) {
        guard let view = headerFooterV else { return }
        
        // 需要布局子视图
        view.setNeedsLayout()
        // 立马布局子视图
        view.layoutIfNeeded()
        
        let height = view
            .systemLayoutSizeFitting(UILayoutFittingCompressedSize).height
        var frame = view.frame
        frame.size.height = height
        view.frame = frame
        // 重新设置tableHeaderView
        headerFooterV = view
    }
}

使用方法:

//设置tableHeaderFooterView
tableView.setupHeaderFooterV(headerV: myHeaderV, footerV: nil)
tableView.setupHeaderFooterV(headerV: myHeaderV, footerV: myFooterV)

根据内容更新高度:

//设置自己定义的view
let footerV = MyView()
//设置为底部的view
tableView.setupHeaderFooterV(headerV: nil, footerV: footerV)
headV.data = "这里是内容,设置这个内容headV的高度会变化"
//更新底部的view的size
tableView.updateHeaderFooterVSize()

相关文章

网友评论

    本文标题:swift中tableHeaderFooterView高度自动计

    本文链接:https://www.haomeiwen.com/subject/flwxmftx.html