Swift4 - 动态计算UITableView中tableHeaderView的高度 - 获取子控件高度和宽度
1.固定高度的 tv头部,不根据数据源隐藏某些控件,适用下面的方法
override init(frame: CGRect) {
super.init(frame: frame)
self.translatesAutoresizingMaskIntoConstraints = false
}
override func didMoveToSuperview() {
super.didMoveToSuperview()
if let superV = self.superview{
self.leadingAnchor.constraint(equalTo: superV.leadingAnchor).isActive = true
self.topAnchor.constraint(equalTo: superV.topAnchor).isActive = true
self.trailingAnchor.constraint(equalTo: superV.trailingAnchor).isActive = true
}
}
使用的时候很简单
/// tv的 头部
private lazy var tvHeaderView = JYSilverCoinTopView() tv.tableView.tableHeaderView = tvHeaderView
tvHeaderView.delegate = self
tv.translatesAutoresizingMaskIntoConstraints = false
2.下面的方法:适用 更具数据源 动态改变 头部高度
核心 :
/// 重置 tableview的header的frame
private func sizeHeaderToFitForTableHeaderView() {
//FIXME: 这里一定要用过滤,不然会得到默认自带的headerView,高度还不可控
if let headerView = tableView.tableHeaderView {
headerView.setNeedsLayout()
headerView.layoutIfNeeded()
let height = headerView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height
var frame = headerView.frame
frame.size.height = height
frame.size.width = self.frame.size.width
headerView.frame = frame
DDLOG(message: frame)
tableView.tableHeaderView = headerView
}
}
/// 获取 子控件高度
func sizeHeaderToFit(view:UIView) {
view.setNeedsLayout()
view.layoutIfNeeded()
let width = view.systemLayoutSizeFitting(UILayoutFittingCompressedSize).width
let height = view.systemLayoutSizeFitting(UILayoutFittingCompressedSize).height
}
可以参考 :
https://blog.csdn.net/longshihua/article/details/78595502
1. headerView 设置
import UIKit
class JYNewCardDetailHeaderV: UIView {
/// 储值卡总耗卡
let dyczkzhkLabel = UILabel(text: "储值卡总耗卡", fontSize: 16, isSetBoldFontSize: true, textColor: UIColor.init(hexColor: "424242"), textAlignment: .left)
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func configData(){
}
}
extension JYNewCardDetailHeaderV{
func setupUI() {
//VFL或者 layout设置 要把这个设置为false , snapkit 正常设置,不写的话界面也正常,就是报约束错误
self.translatesAutoresizingMaskIntoConstraints = false
let vd : [String:UIView] = ["dyczkzhkLabel":dyczkzhkLabel
vd.fastAddToView(self)
self.fastAddConstraints("|[dyczkzhkLabel]|", vd)
self.fastAddConstraints("V:|-10-[dyczkzhkLabel]-10-|", vd)
}
}
2. 使用这个view的地方配置
import Foundation private let cellID = "JYNewCardDetailCell"
class JYStatmentCarView: UIView { 1. //创建headerV
let headerV = JYNewCardDetailHeaderV(frame: CGRect.zero) //创建tableview
fileprivate lazy var tableView : UITableView = {
let tableView = UITableView.init(frame: CGRect.zero, style: .plain)
tableView.delegate = self
tableView.dataSource = self
tableView.separatorStyle = .none
tableView.register(JYNewCardDetailCell.self, forCellReuseIdentifier: cellID)
return tableView
}() override init(frame: CGRect) {
super.init(frame: frame)
self.translatesAutoresizingMaskIntoConstraints = false
self.configUI()
} //3.重新计算header的frame
override func layoutSubviews() {
super.layoutSubviews()
sizeHeaderToFit()
}
/// 重置 tableview的header的frame
func sizeHeaderToFit() {
let headerView = tableView.tableHeaderView headerView?.setNeedsLayout()
// 立马布局子视图
headerView?.layoutIfNeeded() let height = headerView?.systemLayoutSizeFitting(UILayoutFittingCompressedSize).height ?? 0
var frame = headerView?.frame ?? CGRect.zero
frame.size.height = height
headerView?.frame = frame
// 重新设置tableHeaderView
tableView.tableHeaderView = headerView
} required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
} /// 布局UI
private func configUI() {
DDLOG(message: "创建卡相关") let vd : [String:UIView] = ["tableView":tableView]
let metrics: [String: Any] = [ "DeviceWidth": JY_DEVICE_WIDTH]
vd.fastAddToView(self)
self.fastAddConstraints("|[tableView(DeviceWidth)]|", vd, [], metrics)
self.fastAddConstraints("V:|[tableView]|", vd, [], metrics) //2.设置tableview的headerView, 并且一定设置headerV的约束
tableView.tableHeaderView = headerV
//VFL设置
headerV.topAnchor.constraint(equalTo: headerV.superview?.topAnchor ?? tableView.topAnchor).fastActive()
headerV.leftAnchor.constraint(equalTo: self.leftAnchor).fastActive()
headerV.rightAnchor.constraint(equalTo: self.rightAnchor).fastActive() //snapkit 设置
// headerV.snp.makeConstraints { (make) in
// make.top.equalToSuperview()
// make.left.right.equalTo(self)
// }
}
}
Swift4 - 动态计算UITableView中tableHeaderView的高度 - 获取子控件高度和宽度的更多相关文章
- ScrollView子控件高度设置无效
ScrollView子控件高度设置无效 简述 项目中引入了第三方的下拉刷新包PullToRefreshScrollView. 由于我之前布局未考虑下拉刷新功能.后来暂时发现添加上去,发现.子控件的高度 ...
- UITableView的子控件高度不确定处理
比如,tableView的tableFootView的控件数量是根据网络请求的数据而定的.那么tableView并不能准确的设置其contentSize.处理方法: 在tableFootView的类中 ...
- Android 在OnCreate()中获取控件高度与宽度
试过在OnCreate()中获取控件高度与宽度的童鞋都知道,getWidth()与getHeight()方法返回是0,具体原因 看一下Activity的生命周期 就会明白. 上代码: 方法一: int ...
- 获取android控件的高度
问题 如何获取一个控件的长和高,相信很多朋友第一眼看见这个问题都会觉得很简单,直接在onCreate里面调用getWidth.getMeasuredWidth不就可以获得了吗,但是,事实上是并没有简单 ...
- IOS中tableView每组的头部控件、通过tableView的代理方法控制某一行的cell能否达到高亮选中状态
一.tableView每组的头部控件 1.控件宽度默认就是tableView的宽度 2.控件高度由下面的代理方法决定 - (CGFloat)tableView:(UITableView *)table ...
- 动态子类化CComboBox以得到子控件EDIT及LISTBOX
动态子类化CComboBox以得到子控件EDIT及LISTBOX Joise.LI写于2004-4-6 ComboBox是比较常用的一个控件,有三种样式:CBS_SIMPLE(简单),CBS_DROP ...
- [转载]在网页中插入media,RealPlayer等控件
[转载]在网页中插入media,RealPlayer等控件 (2012-11-02 20:27:43) 转载▼ 标签: 转载 原文地址:在网页中插入media,RealPlayer等控件作者:Mo ...
- 【案例分享】在 React 框架中使用 SpreadJS 纯前端表格控件
[案例分享]在 React 框架中使用 SpreadJS 纯前端表格控件 本期葡萄城公开课,将由国电联合动力技术有限公司,资深前端开发工程师——李林慧女士,与大家在线分享“在 React 框架中使用 ...
- jQuery学习笔记(在js中增加、删除及定位控件的操作)
代码内容很多都是从amazeui直接copy过来的,先声明,请不要说在下抄袭- - <!-------------------- HTML代码 ----------------------> ...
随机推荐
- tensorflow定义神经网络损失函数MSE
import numpy as np import tensorflow as tf y_pred = np.array([[1], [2], [3]],dtype=np.float32) y_rea ...
- css属性 writing-mode 改变文字书写方向
作为IE的私有属性之一,IE5.5率先实现了 writing-mode ,后期被w3c采纳成标准属性: #test{ -webkit-writing-mode: vertical-rl;/*horiz ...
- vi和vim的三种模式
1.一般模式 用vi 或vim 命令 ——>一般模式 2. 插入模式 i,o,a,r 及其各自大写 ——>插入模式 一般用 i 3.命令行模式 用命令来完成 读取,存盘,替换,离开vim ...
- PowerDesigner 连接oracle数据库
TNS Service Name 不是监听名称,填写这个格式就可以了 10.0.0.2:1521/orcl
- discuz 标签详解
Discuz 模板标签说明 Discuz! 的模板采用近似 PHP 表达式的语法,基本都是可识别的HTML,但涉及到变量和动态内容时,基本形式下: <!-{ 代码内容 }-> 逻辑元素包围 ...
- eclipse 乱码
svn乱码: 教你解决Eclipse中SVN比较乱码问题 workspace->utf-8设置后成功! console乱码: 项目右键 : run as configuration 设置com ...
- MFC 线程中CWnd对象
尽量不要在MFC线程中将CWnd作为参数传递,会引起crash 正确的做法: 1. 将CWnd对应的handle传进来,通过CWnd::FromHandle()函数转换: 2. 在线程中用SendMe ...
- 根据img的url 判断img的图片大小
// 图片地址 后面加时间戳是为了避免缓存 var img_url = 'http://www.qttc.net/static/upload/2013/13643608813441.jpg?'+Dat ...
- rabbitmq /usr/lib/rabbitmq/bin/rabbitmq-server: line 85: erl: command not found
问题描述:在使用命令/sbin/service rabbitmq-server start启动Rabbitmq时,报: Job for rabbitmq-server.service failed b ...
- Mysql 知识(2)
1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一 ...