前提
在写页面的时候很多人都喜欢用纯代码编辑,自然而然需要使用到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()












网友评论