Cell的高度自适应

iOS cell 自适应高度 还记得在上一篇iOS cell 重用中,我提到的 cell 自适应高度吗?那一篇主要解决的是 cell 重用的问题,所以就没有过多的去说有关自适应的问题,而且里面写的也是比较的乱,经过这几天的整理,我已经把 cell 自适应高度(包括纯文本的自适应以及图文混排时的自适应)整理好了,并且已经封装成给类,大家可以直接把这个类导入工程中,直接使用... 我先简单的来几张图片让大家更清楚的了解什么是纯文 阅读详情

序言:

本文主要讲在iOS开发过程中,TableView这个控件是每个开发者几乎都会使用到的控件,应该说是必不可少的控件,而往往的需求就是需要Cell的高度做一个动态适应,因为Cell中的内容可能是不定的,当然通过Model拿到数据之后,去手动计算Frame以及相关约束是没问题的,但是开发效率会相对于采用AutoLayout的自适应高度以及相关约束就显得低下了;本例主要是希望能帮助一些开发者在处理Cell布局以及高度时因频繁的拿到Model之后去计算或者更新相关Frame而感到厌恶的一种帮助吧.

Tastes all differ.

废话不多说,进入正题

UITableView自适应高度布局

实现效果大致如下:

说明:
  1. 本例中Cell的高度不是通过手动计算的.

  2. 本例中用红色框圈起来的部分是一个要注意的地方,就是姓名要求全部展示,职位和公司那块,职位要求优先全部展示,公司名可以不全部展示.代码中关于这块部门有注释,可以注意下.

  3. 本例中使用的布局约束是:Masonry + FDTemplateLayoutCell;FDTemplateLayoutCell是一个在Git上开源的一个关于TableView高度相关的一个比较好用的第三方,当然Star的数量也是很多的,毕竟作者是Sunny,其地址是:FDTemplateLayoutCell

  4. 在使用时,如果是与Masorny 结合使用的或者用的xib原理与效果是一样的,只是在约束时不能少约束了,不然无法准确的得到Cell的高度;有个要注意的点,就是在约束子控件时,最上面的控件相对于父视图的top属性别忘记,以及最底下的控件相对于父视图的bottom属性也别忘记,否则是无法正确计算出Cell高度的.

  5. TableView在初始化的时候,

     tableView.estimatedRowHeight = 120.0;
     tableView.rowHeight = UITableViewAutomaticDimension;
    

这两个属性记得要带上,否则可能会出现想不到的效果.

实现过程

1. 自定义Cell,这一步肯定是比不可少的.

.h文件代码如下

	#import <UIKit/UIKit.h>
	#import "ZJAutoHeightCellDelegate.h"

	@class ITAtutoCellHeightModel;

	@interface ITAutoHeightCell : UITableViewCell

	@property (nonatomic,weak) id 	<ZJAutoHeightCellDelegate> delegate;

	- (void)setModel:(ITAtutoCellHeightModel *)model;

	@end

.m文件代码如下

	#import "ITAutoHeightCell.h"
	#import "ITAtutoCellHeightModel.h"
	#import <YYKit/YYKit.h>

	#import <Masonry/Masonry.h>
	
	#define RGB(r, g, b)        RGBA(r, g, b, 1.0f)
	#define Font(a)     [UIFont systemFontOfSize:a]


	@interface ITAutoHeightCell()

	@property (nonatomic, strong) UILabel *nameLab;
	@property (nonatomic, strong) UILabel *positionLab;
	@property (nonatomic, strong) UILabel *companyLab;
	@property (nonatomic, strong) UILabel *ageLab;
	@property (nonatomic, strong) UILabel *sexLab;
	@property (nonatomic, strong) UIImageView *avatar;
	@property (nonatomic, strong) UILabel *describeLab;
	@property (nonatomic, strong) UIView *sepratorLine;


	@end

	@implementation ITAutoHeightCell

	- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
	if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
    self.selectionStyle = UITableViewCellSelectionStyleNone;
    [self loadSubViews];
    [self addConstraints];
}
	return self;
}

// MARK: - 添加子控件

- (void)loadSubViews {
__weak typeof(self) weakSelf     = self;
_avatar = [[UIImageView alloc]init];
_avatar.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithActionBlock:^(id  sender) {
    if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(didClickUserAvatar)]) {
        [weakSelf.delegate didClickUserAvatar];
    }
}];
[_avatar addGestureRecognizer:tapGesture];
[self.contentView addSubview:_avatar];

_nameLab = [UILabel new];
_nameLab.font = Font(15.0f);
_nameLab.textColor = [UIColor blackColor];
_nameLab.backgroundColor = [UIColor redColor];
[self.contentView addSubview:_nameLab];

//尽量完整显示
// MARK: - position 尽量完整显示
_positionLab = [UILabel new];
_positionLab.font = Font(13.0);
_positionLab.userInteractionEnabled = YES;
_positionLab.backgroundColor = [UIColor greenColor];
_positionLab.textColor = [UIColor lightGrayColor];
//不可以被压缩,尽量显示完整
[_positionLab setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
UITapGestureRecognizer *tapPosition = [[UITapGestureRecognizer alloc]initWithActionBlock:^(id  sender) {
    if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(didClickUserPosition)]) {
        [weakSelf.delegate didClickUserPosition];
    }
}];
[_positionLab addGestureRecognizer:tapPosition];
[self.contentView addSubview:_positionLab];


//可以被压缩显示
// MARK: - 公司名可以压缩显示
_companyLab = [UILabel new];
_companyLab.font = Font(13.0);
_companyLab.backgroundColor = [UIColor yellowColor];
_companyLab.userInteractionEnabled = YES;
//宽度不够时,可以被压缩
[_companyLab setContentCompressionResistancePriority:UILayoutPriorityFittingSizeLevel forAxis:UILayoutConstraintAxisHorizontal];
//抱紧,压缩
[_companyLab setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
_companyLab.textColor = [UIColor blueColor];

UITapGestureRecognizer *tapCompany = [[UITapGestureRecognizer alloc]initWithActionBlock:^(id  sender) {
    if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(didClickUserCompany:)]) {
        [weakSelf.delegate didClickUserCompany:self];
    }
}];
[_companyLab addGestureRecognizer:tapCompany];
[self.contentView addSubview:_companyLab];

_ageLab = [UILabel new];
_ageLab.font = Font(13.0f);
_ageLab.textColor = [UIColor lightGrayColor];
[self.contentView addSubview:_ageLab];

_sexLab = [UILabel new];
_sexLab.font = Font(12.0f);
_sexLab.textColor = [UIColor lightGrayColor];
[self.contentView addSubview:_sexLab];

_describeLab = [UILabel new];
_describeLab.font = Font(14.0f);
_describeLab.numberOfLines = 0;
_describeLab.lineBreakMode = NSLineBreakByCharWrapping;
_describeLab.backgroundColor = [UIColor yellowColor];
[self.contentView addSubview:_describeLab];

_sepratorLine = [UIView new];
[_sepratorLine setHidden:YES];
_sepratorLine.backgroundColor = [UIColor lightGrayColor];
[self.contentView addSubview:_sepratorLine];
}

// MARK: - 添加约束

- (void)addConstraints {
[self.avatar mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.left.equalTo(self.contentView).offset(15);
    make.width.height.equalTo(@(70));
}];

//namelabel 后面如果还跟着有label,要做自适应宽度,namelabl的宽度不能写死,自适应宽度
[self.nameLab mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.equalTo(self.avatar.mas_right).offset(15);
    make.top.equalTo(self.avatar).offset(4);
}];

[self.positionLab mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.equalTo(self.nameLab.mas_right).offset(10);
    make.top.equalTo(self.nameLab.mas_top).offset(1);
}];

[self.companyLab mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.equalTo(self.positionLab.mas_right).offset(10);
    make.top.equalTo(self.nameLab.mas_top).offset(0);
    //priorityLow 如果不加优先级,会出现三个label都能显示的情况下,namelabel会偏差很多
    make.right.equalTo(self.contentView).offset(-10).priorityLow();
}];


[self.ageLab mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.equalTo(self.nameLab).offset(0);
    make.top.equalTo(self.nameLab.mas_bottom).offset(8);
    make.right.equalTo(self.contentView).offset(-15);
}];

[self.sexLab mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.equalTo(self.nameLab).offset(0);
    make.top.equalTo(self.ageLab.mas_bottom).offset(8);
    make.right.equalTo(self.contentView).offset(-15);
}];


[_describeLab mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.equalTo(self.contentView).offset(15);
    make.top.equalTo(self.avatar.mas_bottom).offset(15);
    make.right.bottom.equalTo(self.contentView).offset(-15);
}];

[_sepratorLine mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.equalTo(self.contentView).offset(15);
    make.right.equalTo(self.contentView).offset(-15);
    make.height.equalTo(@0.5);
    make.bottom.equalTo(@(0));
}];
}

// MARK: - 赋值

- (void)setModel:(ITAtutoCellHeightModel *)model {
[_avatar sd_setImageWithURL:[NSURL URLWithString:model.avatar] placeholderImage:[UIImage imageNamed:@"to"]];
[_nameLab setText:model.name];
if ([model.isHightLight isEqualToString:@"1"]) {
    [self.contentView setBackgroundColor:RGB(187, 242, 204)];
} else {
    [self.contentView setBackgroundColor:[UIColor whiteColor]];
}
[_positionLab setText:model.position];

[_companyLab  setText:model.company];
[_ageLab setText:model.age];
[_sexLab setText:model.sex];
[_describeLab setText:model.describe];

}

- (void)awakeFromNib {
[super awakeFromNib];
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
}

@end
2. 在TableView中使用对应的Cell
  1. 注册相应的Cell

  2. 在 **- (UITableViewCell *)tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath )indexPath 中

     - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
     ITAutoHeightCell *cell = [tableView  dequeueReusableCellWithIdentifier:kIdentifier forIndexPath:indexPath];
     cell.selectionStyle = UITableViewCellSelectionStyleNone;
     [self configureCell:cell atIndexPath:indexPath];
     return cell;
     }
     
     //配置Cell中对应的Model
     - (void)configureCell:(ITAutoHeightCell *)cell atIndexPath:(NSIndexPath *)indexPath{
    

    [cell setModel:[_viewModel cellModel:indexPath]];
    }

  3. 注意HeightForCell该方法中的相关改变:

     - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
     	return [tableView fd_heightForCellWithIdentifier:kIdentifier cacheByIndexPath:indexPath configuration:^(ITAutoHeightCell *cell) {
         [self configureCell:cell atIndexPath:indexPath];
     }];
     }
    

总结

  1. 使用Masonry(或者Xib) 约束好Cell中的子控件.
  2. 向Table中注册cell
  3. 根据ID找到对应的cell,根据Cell中子控件的约束,自动计算出Cell的高度
  4. Model赋值

个人觉着这种方式是很方便的,而且该第三方中分为使用缓存和不使用缓存的API,在使用的过程中可以自己去体验下有缓存和无缓存的区别;希望能对不想手动计算Cell高度的开发者有帮助.有问题可以在下方提问,我会尽力去解答;如果有需要Demo的同学,可以在下方留言.

备注:转载请注明,请尊重原创者的劳动成果,谢谢配合.
如果有不明白或者有什么建议,欢迎在评论下方留言,我会尽力在第一时间回复的.欢迎大家来共同讨论学习.
### iOS 张袁旭
IOS UItableview UIcollectionview cell高度自适应 阅读详情

相关推荐

iOS UIImageView自适应cell高度

核心代码展示 __block CGFloat topicViewHeight = .0f; NSArray *imageUrls = [model.imageUrl componentsSeparatedByString:@","]; NSLog(@"%@",imageUrls); for (int i = 0 ; i &lt; imageUr...

WLin的博客 1264

react 表格高度自适应

使用calc()给元素的border、margin、pading、font-size和width等属性设置动态值。不过calc()最大的好处就是用在流体布局上,可以通过calc()计算得到元素的宽度。一般用来设置流式布局宽高,当然,可以使用calc()给元素的border、margin、pading、font-size和width等属性设置动态值。vh: 相对于视窗的高度, 视窗被均分为100单位的vh;vw: 相对于视窗的宽度, 视窗被均分为100单位的vw;: 相对于视窗的宽度或高度中较大的那个。

weixin_45239190的博客 1094

cell高度自适应实现的最简单方式

曾经为了实现cell的高度自适应,不知道吃了多少苦。那个时候,是在我的数据模型model中添加一个height属性,实现它的get方法,在get方法中计算需要多行显示文字的高度,然后再加上其他乱七八糟的高度并返回,然后在tableview的 - (CGFloat)tableView:(UITableView )tableView heightForRowAtIndexPath:(NSIndexP

知更鸟CoolLee的博客 1万+

Cell自适应行高

在UITableView中要想cell自适应行高,其实就是UIlabel上的文本根据文本以及文本字体大(即boundingRectWithSize方法)来进行高度的调整,从而重新对cell上UIlabel下面的其他控件进行frame上的y的改变,达到cell上的布局调整,高度的自适应,代码如下: 在VC文件中 - (UITableViewCell *)tableView:(UITableVie

MinggeQingchun的博客 1221

UITableViewCell 嵌套 UIWebView,cell自适应高度

现在做的项目里,遇到了这样的情况:

妙亦涵的博客 5796

UItableView Cell 高度自适应--随着多个label内容变化自适应

看了前辈的cell 自有适应。更具需求。完成上下 多个label 自适应 文章链接:http://blog.youkuaiyun.com/swingpyzf/article/details/18093959

u012106239的博客 3249

iOS 使用Masnory实现TableViewCell高度自适应

然后才Cell中每个控件约束高度都要设置好,最下面的一个控件bottom要设置self.contentView.mas_bottom。

秋枫 936

3_3_iOS开发_Cell的自适应高度, 表中表

3_3_iOS开发_Cell的自适应高度, 表中表。

m0_52635912的博客 259

iOS tableview自适应高度

tableview的自适应高度分为ios8.0前和ios8.0后

憧憬的博客 980

使用Masonry实现自适应高度的UITableView Cell

在iOS开发中,约束(Constraints)是一种声明式布局方法,用于定义视图之间的位置关系和尺寸规则。约束系统通过约束来确定视图在父视图中的位置和大小,以及视图间相互的间距关系。在iOS 6及以后版本中,Apple引入了Auto Layout作为主流布局方式,而Masonry作为第三方库,进一步简化了约束的编写和维护。与传统的frame布局相比,使用约束布局具有以下优点:视图尺寸的适应性:约束能够使视图适应不同的屏幕尺寸和方向变化,无需手动计算新的frame。内容的适应性。

weixin_33597080的博客 1216

用SPSS做信效度分析

对问卷进行Cronbach’s Alpha信度检验。如果此值高于0.8,则说明信度高;如果此值介于0.7-0.8之间,则说明信度较好;如果此值介于0.6~0.7,则说明信度可接受;如果此值小于0.6,说明信度不佳。下面利用SPSS进行分析,点击分析–标度–可靠性分析选项,选中所要分析的问卷数据或题目。得到结果,我们要看这个有用的结果,当克隆巴赫Alpha系数(也可以看标准化后的)大于0.8时候,说明问卷信度较高。

小高~的博客 1万+

masonry + 自适应cell高度

在之前各种找自适应cell,现在又得结合masonry来自动计算cell的高度,在网上查找各位大神的办法,就是感觉代码好多,经过半天的艰苦奋斗,重要找出来了一个简单的办法,代码看着很少哟!!        但是要想实现这个功能的话,你得准备好masonry框架,可通过cocoapods方法或者手动添加导入实现,手动导入masonry的下载链接 https://github.com/liuyanl

Red_coralDown的专栏 1万+

单细胞数据导入实战:Read10X函数常见报错与解决方案

本文针对单细胞转录组分析中Read10X函数数据导入的常见问题,提供了详细的实战解决方案。重点解析了因文件路径错误、压缩文件未解压、版本命名不符及内存不足导致的报错,并给出了检查路径、正确解压、重命名文件、调整参数及优化内存等具体操作步骤,帮助用户高效完成单细胞数据导入,为后续分析奠定坚实基础。

weixin_28235513的博客 241

Cell 的简单自适应高度

简单的cell自适应高度 在viewDidLoad中写上这两句就够了 self.tableView.estimatedRowHeight = 100;  //  随便设个不那么离谱的值 self.tableView.rowHeight = UITableViewAutomaticDimension; 都不需要实现tableView的代理方法heightForRow

JustinAelx的博客 841

ABB RobotStudio 和 S7-PLCSIM Advanced V5.0 搭建虚拟通信环境,实现 PLC 对机器人布尔量、数字量和模拟量的控制。

本教程详细介绍了如何利用ABB RobotStudio和S7-PLCSIM Advanced V5.0搭建虚拟通信环境,实现PLC对机器人的布尔量、数字量和模拟量控制。主要内容包括:在TIA Portal V20中配置PLC项目并编写通信程序;通过S7-PLCSIM Advanced创建虚拟PLC运行环境;在RobotStudio中设置机器人PROFINET通信;以及建立虚拟网络连接并进行功能测试。该方案适用于工业自动化虚拟调试,可显著降低现场调试风险。操作需注意软件版本兼容性、网络配置及信号映射准确性,最

CHUXUEZHE8210的博客 2519

cell自适应高度

cell自适应高度import “MyCell.h”define WIDTH self.contentView.frame.size.widthdefine HEIGHT self.contentView.frame.size.height@implementation MyCell-(instancetype)initWithStyle:(UITableViewCellStyle)style re

a826161815的博客 478

JAVA:Spring Boot 集成 Atomikos 实现分布式事务

摘要: Atomikos是一款基于JTA标准的分布式事务协调器,通过两阶段提交(2PC)协议实现跨数据库/消息系统的事务一致性,适用于金融等高要求场景。本文以Spring Boot集成Atomikos为例,演示多数据源(订单库、库存库)的分布式事务管理。核心步骤包括:引入Atomikos依赖、配置XA数据源、设置两阶段提交的MyBatis多数据源,并通过Atomikos协调全局事务,确保跨库操作原子性。代码示例涵盖配置类、YAML定义及MySQL XA数据源初始化,为分布式系统提供强一致性解决方案。

木头 334

SDAutoLayout快速实现Cell的高度自适应

SDAutoLayout快速实现cell高度自适应

zthhsa的博客 3083

【Codecs系列】HEVC-SCC(一):核心技术介绍

DATE: 2020.6.4【Tags: HEVC SCC】 1、参考网址 2、SCC简介 3、HEVC-SCC核心技术

优快云明星博主,认证博客专家,视频、Matlab领域优质创作者。 4806

Android CCodec (十七) 硬件解码调用分析-1(基于V4l2)

简单的分析V4L2DecodeComponent和其相关内容,后续针对解码调用单独分析。

给大佬递杯卡布奇诺的博客 6596

iOS开发-写给萌新们的UITableView的Cell高度自适应方法

Emmmm…. 时间过得好快,一晃眼一年就过去了,打开尘封已久的优快云博客,发现自己堕落了无数时光,但人活着总是要混口饭吃的嘛,所以再度起航,键盘敲起来,文章写起来。希望大家能支持我这个垃圾猿,好啦切入正题。 皮一下很开心 上周在技术群里看萌新们在问UITableView的Cell怎么自适应宽高(xib和storyboard的我就不说了,关东升老哥的书里全都是),有装大佬的人就给他们...

伪随机的张三 3789

【人工智能之深度学习】15. 工业时序预测实战:LSTM与TCN融合的装备故障预警系统设计与实现

摘要:工业装备故障预警是智能制造领域的核心技术之一,其通过分析传感器时序数据实现故障提前预测,可显著降低运维成本并提升设备可靠性。本文针对工业时序数据多源异构、非平稳性、噪声干扰及样本不平衡等挑战,提出一种LSTM与TCN融合的故障预警架构——利用TCN捕捉局部时序特征,结合注意力增强LSTM建模长期依赖关系,通过门控机制实现特征自适应融合。以3MW风电齿轮箱为研究对象,设计包含数据预处理、特征工程、模型训练及部署的完整流程,实验结果表明,该融合模型准确率达94.6%,故障预测提前量较单一模型提升30%以上

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1443

html cell高度设置,cell上使用自适应高度的webView

cell 上使用自适应高度的webView注意点1.不能使用cell复用 出现问题:每次cell出现,或者消失,cell被复用,已经加载的webview都需要重新加载,加载成功重新刷新高度 ,在滑动刷新的过程会反复加载形成循环2.再不使用复用的情况下,已经加载过的添加加载标示,不再重复加载,避免良妃资源,卡顿3. 适用于cell个数不是太多的需求,1. 创建cell-(UITableViewCel...

weixin_36046702的博客 595

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

IOS TableView的Cell高度自适应,UILabel自动换行适应

IOS TableView的Cell高度自适应,UILabel自动换行适应

Leemin_ios的博客 996

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: 建立人脉关系以及可能认识的人推荐
下一篇: 使用Xcode增加环境变量(多种环境区分)
FreshManCode
博客等级 码龄9年 8粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值