在iOS开发中或多或少的都会碰到TableViewCell高度自适应,那么今天这篇文章就简单的介绍一下如何给tableViewCell自适应高度 #ViewController copy

@interface ViewController ()<UITableViewDelegate, UITableViewDataSource>{UITableView *_tableView;
}@property (nonatomic, strong) NSMutableArray *modelArr;@property (nonatomic, assign) CGFloat rowHeight;      //确定cell的高度@end@implementation ViewController- (NSMutableArray *)modelArr{    //初始化modelif (!_modelArr) {NSArray *arr = @[@"大概是因为最近发了一些关于唐诗的文章,有读者发来消息,说家里有孩子马上要上初中,希望我能够推荐书单,“学校的老师只是让不停地抄写,推荐的书她也不爱看,自己选书看。\"",@"但其实,我并不喜欢向人推荐书单。因为在我看来,阅读,其实是很私人化的事情。", @"我一直记得我以前写过我在读大学时看《约翰·克里斯多夫》的情景——我花了大半个学期,费尽心神,才将那本厚厚的书我读了三分之二。但后来,我还是无法坚持下去。那个时候的我,根本不知道那本书要说什么,书里写的内容,现在也毫无印象。",@"“那个变态,居然读《约翰·克里斯多夫》。”有室友说。", @"从此之后的很长时间,我几乎都不再看世界名著。即便看《约翰·克里斯多夫》的时候,我是中文系大二的学生,专业课成绩在班级里名列前茅。"];_modelArr = [NSMutableArray arrayWithArray:arr];}return _modelArr;
}
复制代码

rowHeight

保存计算好的cell的高度,然后在delegate中给cell高度赋值

modelArr

在get方法中初始化模型数组,当使用时就去创建,减少内存开支 #ViewController copy

- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor whiteColor];[self createTableView];      //创建tableView
}static NSString *cellId = @"cellId";
- (void)createTableView{_tableView = [[UITableView alloc] initWithFrame:self.view.bounds];_tableView.dataSource = self;_tableView.delegate = self;_tableView.estimatedRowHeight = 130;      //估算cell高度[self.view addSubview:_tableView];[_tableView registerClass:[MyTableViewCell class] forCellReuseIdentifier:cellId];
}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{return self.modelArr.count;
}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];cell.text = self.modelArr[indexPath.row];        //给cell赋值self.rowHeight = cell.rowHeight;          //返回cell高度return cell;
}- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{return self.rowHeight;
}
复制代码

_tableView.estimatedRowHeight = 130;

如果你不加这句话的话TableView也是正常显示,但是当你在返回cell和cell高度的方法中打个断点你会发现在还没返回cell的时候它就在一直调用这个方法

3*self.modelArr.count 次 为什么会有这么多次暂时留一个小尾巴,以后再仔细研究

当调用完这个方法之后再走的是返回cell的方法,然后再走返回高度的方法 所以当你的cell高度差距不确定的时候,最好给cell估算一个大概高度以便提高运行效率

MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId]; cell.text = self.modelArr[indexPath.row]; //给cell赋值 self.rowHeight = cell.rowHeight; //返回cell高度

这里一定是先给cell填充内容然后再获取cell高度,一定要在控制器里保存一下rowHeight 如果你这样写

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{return ((MyTableViewCell *)[tableView cellForRowAtIndexPath:indexPath]).rowHeight;
}
复制代码

你会发现所有的cell都挤在了一起,很无语

这里也是一个遗留问题的小尾巴

#MyTableViewCell copy

@interface MyTableViewCell : UITableViewCell@property (nonatomic, copy) NSString *text;
@property (nonatomic, strong) UIImageView *imageV;
@property (nonatomic, strong) UILabel *label;
@property (nonatomic, assign) CGFloat rowHeight;@end@implementation MyTableViewCell- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {_imageV = [[UIImageView alloc] init];_imageV.image = [UIImage imageNamed:@"icon_add_img"];    //气泡图片[self.contentView addSubview:_imageV];_label = [[UILabel alloc] init];_label.numberOfLines = 0;        //设置label行数为最大[_imageV addSubview:_label];}return self;
}- (void)setText:(NSString *)text{_text = text;_label.text = text;_label.font = [UIFont systemFontOfSize:14.0];//计算label高度CGRect rect = [text boundingRectWithSize:CGSizeMake(self.frame.size.width - 160, 99999) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName :   [UIFont systemFontOfSize:14.0]} context:nil];_label.frame = CGRectMake(80, 10, rect.size.width, rect.size.height);_imageV.frame = CGRectMake(30, 10, rect.size.width + 160, rect.size.height + 80);[_imageV.image stretchableImageWithLeftCapWidth:150 topCapHeight:0];      //拉伸image_rowHeight = CGRectGetMaxY(_imageV.frame) + 20;      //获取cell高度
}@end
复制代码

CGRect rect = [text boundingRectWithSize:CGSizeMake(self.frame.size.width - 160, 99999) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:14.0]} context:nil];

通过这个方法来计算label的高度,然后返回给cell的rowHeight 把我给的代码复制粘贴运行一下是不是可以了 或许你觉得label不是从x=0的位置开始的,是因为在label的frame位置设置的x=80并且把label加在了imageVIew上了,自己改一下就行了,或者你拿一个气泡图片放上面试试效果也不错

这个图片有些尴尬....毕竟自己做着玩的东西不好意思麻烦美工

运行一下代码试试

感觉还算不错,但是滑动一下试试就有些不对了

其实正确的图片是最后这个,但是第一张图的cell右侧为什么会出现一部分空白地方呢,这也是一个问题(猜想:空白位置是cell删除按钮的宽度)

一篇文章下来出现了很多问题,现在总结一下怎么解决cell高度自适应的问题 1.在cell里面定义一个rowHeight,当传入数据的时候给rowHeight赋值 2.计算label高度可以用到boundingRectWithSize这个方法 3.在创建TableView的时候最好给rowHeight一个估值,以便提高运行效率 4.在控制器中定义一个rowHeight以便保存赋值之后的cell高度 5.聊天气泡图片拉伸方法stretchableImageWithLeftCapWidth

存在的问题 ##为什么返回cell高度的方法会走了3遍的modelArr.count ##为什么不能通过cell直接获取cell高度

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{return ((MyTableViewCell *)[tableView cellForRowAtIndexPath:indexPath]).rowHeight;
}
复制代码

##为什么cell右侧会空余出删除按钮的宽度 解决方案:这个确实是历史遗留问题,在layoutSubviews里面更新一下控件的frame就可以了

希望有知道解决方法的大神能给予指点,多谢多谢

简单的TableViewCell高度自适应(只有Label,仅当参考思路)相关推荐

  1. 从中国历年人口数据简单分析未来房价走势(本分析仅供参考)

    以下数据来自中国统计局官方网站 如上图可以看到,从1981 - 1997 的连续17年,中国每年人口净出生人口都在2000万以上.然后从1998年开始,逐年减少,从2001年开始至2017年,每年净出 ...

  2. iOS UITableView+FDTemplateLayoutCell 配合AutoLayout分分钟教你实现类似微信朋友圈的动态高度自适应

    11.30日更新,实现了简单的微信朋友圈,点赞,评论,图片,高度自适应,下拉展开等各种效果Demo 点击打开链接 11.10更新 这种高度自适应的Label切记一定要加上这个属性 preferredM ...

  3. 让tableView的高度等于contentSize的高度、动态调整tableView的高度、tableView的高度自适应布局...

    文章概要: 1.简介下,tableView中的内容如何高度自适应的布局 2.如何做到让tableView的高度动态调整 还是看图作文吧- 首先,tableView的高度就是用户能够看见里面更大世界的那 ...

  4. 2015 / 11 / 14 日结 /tableviewcell高度的坑 / label 自适应的坑 / heardview 头部的坑

    今天遇到的问题: 1,heardview 头部高度问题,当设置tableview的tableviewheardview属性,再调用系统方法 - (CGFloat)tableView:(UITableV ...

  5. iOS-基础控件--UITbleViewCell的自定义(高度自适应方法简单封装)

    青楼梦好,难赋深情<巨钳蟹> UITableVie 中系统的Cell共提供了四种默认样式, 分别是: UITableVieCellStyleDefault UITableVieCellSt ...

  6. css设置元素 网页高度自适应,css高度自适应如何实现?css高度根据内容自适应的简单方法...

    在进行网页开发时,可能会遇到这样的情况,网页中的内容会超出你原先设置的高度或者宽度,这时就需要实现高度自适应或者宽度自适应,下面这篇文章将给大家来介绍关于css高度自适应. PS:css宽度自适应的介 ...

  7. html中高度自动调整,css高度自适应如何实现?css高度根据内容自适应的简单方法...

    在进行网页开发时,可能会遇到这样的情况,网页中的内容会超出你原先设置的高度或者宽度,这时就需要实现高度自适应或者宽度自适应,下面这篇文章将给大家来介绍关于css高度自适应. PS:css宽度自适应的介 ...

  8. jqGrid 如何实现高度自适应 跟随窗口尺寸变动自动调整高度

      jqGrid可以在构建的时候通过height参数来设置表格初始高度,也可以在后续通过调用setGridHeight函数来动态设置表格高度.本文利用jqGrid的setGridHeight函数和wi ...

  9. 巧用margin/padding的百分比值实现高度自适应(

    转载自https://segmentfault.com/a/1190000004231995 巧用margin/padding的百分比值实现高度自适应(多用于占位,避免闪烁) 布局 自适应 前端 cs ...

最新文章

  1. 微软:外接 USB 设备或 SD 卡时将无法更新 Windows 1903
  2. Java查询spark中生成的文件_java+spark-sql查询excel
  3. Spring Boot系列二 Spring @Async异步线程池用法总结
  4. java test报错_Java 单元测试报错
  5. WebService系列(三)--创建自己的WebService
  6. 解决df -h卡死问题
  7. 从命令行接收多个数字,求和之后输出结果
  8. 2021年双十一大复盘:众人唱衰双十一,我们却发现了这些机会
  9. 不用空格怎么打两个空格_身份证号码中有空格,你让我怎么替换?
  10. TClientDataSet[2]: Data、XMLData
  11. linux jsp mysql_Linux JSP连接MySQL数据库
  12. 软件测试简历职业规划怎么写,职业规划测试
  13. 通达信、东方财富神奇九转指标计算公式,代码实现
  14. TM1638数码管显示板(8数码管+16按键)单片机C语言驱动程序(显示功能)
  15. 鲁棒控制(棒棒控制原理)
  16. matlab最小二乘法拟合原理,最小二乘法曲线拟合_原理及matlab实现
  17. docker快速搭建http服务器
  18. 如何将电脑(网线)网络共享给iPhone苹果手机(不需要数据线)
  19. Win10下使用nvm安装多个版本node.js
  20. rp_rv1126开发板UVC XU扩展协议功能验证

热门文章

  1. 【Qt】通过QtCreator源码学习Qt(十):多国语言支持
  2. 【驱动】GNSS驱动基础
  3. 中国大学生创业报告发布
  4. linux mysql添加用户名和密码错误,linux下为mysql设置用户名和密码
  5. dac生成信号频率取决于_DAC和AOC,谁将是数据通信领域最终赢家?
  6. 扬州市大学计算机专业录取分数线,“计算机网络技术”专业录取分数线
  7. mysql客户端指令_mysql command line client(mysql命令行客户端)
  8. Mybatis注解学习记录
  9. python中json dumps_python中json.loads,dumps,jsonify使用
  10. u-charts 曲线图中间有部分没数据,导致点和点无法连成线的问题解决