2019独角兽企业重金招聘Python工程师标准>>>

方法1:iOS8的自动计算

此方法必须使用autolayout,这里我是用的xib设置的,也可以使用第三方框架masonry设置。

设置约束的时候必须注意每个控件在垂直方向上必须都有约束,这样cell才可以计算出来高度。
下面我们来看看cell的内部控件的垂直方向的约束如何设置

-(void)setUpView{

UIImageView *headImagev = [[UIImageView alloc]init];

[self addSubview:headImagev];

UILabel *contentL = [[UILabel alloc]init];

contentL.numberOfLines = 4;

[self addSubview:contentL];

UIImageView *contentImageV = [[UIImageView alloc]init];

[self addSubview:contentImageV];

UILabel *userL = [[UILabel alloc]init];

[self addSubview:userL];

self.headImage = headImagev;

self.userContentString = contentL;

self.userContentImage = contentImageV;

self.userName = userL;

[headImagev mas_makeConstraints:^(MASConstraintMaker *make) {

make.width.mas_equalTo(40);

make.height.mas_equalTo(40);

make.left.mas_equalTo(self).offset(0);

make.top.mas_equalTo(self).offset(10);

}];

[userL mas_makeConstraints:^(MASConstraintMaker *make) {

make.left.equalTo(headImagev.mas_right).offset(13);

make.right.equalTo(self).offset(-142);

make.top.equalTo(self).offset(10);

}];

[contentL mas_makeConstraints:^(MASConstraintMaker *make) {

make.left.equalTo(userL).offset(0);

make.top.equalTo(userL.mas_bottom).offset(8.5);

make.right.equalTo(self).offset(-10);

}];

[contentImageV mas_makeConstraints:^(MASConstraintMaker *make) {

make.top.equalTo(contentL.mas_bottom).offset(8);

make.bottom.equalTo(self).offset(-10);

make.height.mas_equalTo(304);

make.left.equalTo(contentL).offset(0);

make.right.equalTo(self).offset(0);

}];

}

tabView.estimatedRowHeight = 150;

self.tableView.rowHeight = UITableViewAutomaticDimension;

可能遇到的问题和解决办法

1.高度不对

这个问题是因为约束没有满足自上而下,从而系统不知道怎么去计算。解决办法就是去修改约束,直到满足为止。一定要好好理解约束啊!

2.点击状态栏无法滚动到顶部
我们知道,如果界面中有UIScrollView的话,点击状态栏会让其滚动到顶部

但是如果我们用了自动计算高度的方法,又调用了tableView的reloadData方法(例如我们的数据有分页的时候,加载完下一页的数据后会去刷新tableView)。这时候就会出现问题,点击状态栏就有几率不能精确滚动到顶部了。

解决这个问题的办法是去缓存cell的高度,代码如下:

@property (nonatomic, strong) NSMutableDictionary *heightAtIndexPath;//缓存高度所用字典
#pragma mark - UITableViewDelegate
-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{NSNumber *height = [self.heightAtIndexPath objectForKey:indexPath];if(height){return height.floatValue;}else{return 100;}
}- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{NSNumber *height = @(cell.frame.size.height);[self.heightAtIndexPath setObject:height forKey:indexPath];
}

解释一下,就是用一个字典做容器,在cell将要显示的时候在字典中保存这行cell的高度。然后在调用estimatedHeightForRowAtIndexPath方法时,先去字典查看有没有缓存高度,有就返回,没有就返回一个大概高度。

缓存高度之后,在demo里面多试几次,发现点击状态栏已经可以精确滚动回顶部了:

方法2:iOS6的系统API结合autolayout

方法3、手动计算

该方法需要手动计算垂直高度上每个控件的高度,然后相加得出cell的高度。
这种方法最繁琐,但是也是最精确的,也是最可控的。
使用这个方法,可以不需要使用autolayout设置约束,直接使用frame设置每个控件的位置。但是为了方便,我这里还是使用autolayout设置控件的约束和位置。

因为需要确切的知道每个控件的高度,所以这里image的高度必须是固定的,这样才可以进行cell的高度计算
修改如下

修改的代码如下:

  1. //TableViewModel.m文件
  2. //===============================
  3. #import "TableViewModel.h"
  4. @implementation TableViewModel
  5. //方法3代码
  6. - (CGFloat)cellHeight{
  7. // 文字的最大尺寸(设置内容label的最大size,这样才可以计算label的实际高度,需要设置最大宽度,但是最大高度不需要设置,只需要设置为最大浮点值即可),53为内容label到cell左边的距离
  8. CGSize maxSize = CGSizeMake([UIScreen mainScreen].bounds.size.width - 53, MAXFLOAT);
  9. // 计算内容label的高度
  10. CGFloat textH = [self.userContentString boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:14]} context:nil].size.height;
  11. /*
  12. 昵称label和cell的顶部为0
  13. 17为昵称label的高度
  14. 8.5为昵称label和内容label的间距
  15. textH为内容label的高度
  16. 304为内容image的高度
  17. */
  18. _cellHeight = 0 + 17 + 8.5 + 8 +textH + 304;
  19. return _cellHeight;
  20. }
  1. //ViewController.m文件
  2. //==========================
  3. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
  4. //方法3代码
  5. TableViewModel *model =  self.modelArray[indexPath.row];
  6. return model.cellHeight;
  7. }

方法四、使用第三方框架

这是国内的一个大神写的框架,可以一行代码就实现cell的高度自动计算。同时还能实现缓存高度,最低兼容版本为iOS6。
实现代码就不写了,非常简单

具体看这篇文章:《优化UITableViewCell高度计算的那些事》

总结:

上面四种方法各有优缺点,如果你的App最低兼容版本是iOS8,那请毫不犹豫的选择方法一的系统方法吧,高效简洁。

如果你需要最低兼容iOS6,可以从其他三个方法中选一个,建议使用方法四的第三方框架,高效强大。

所有的代码都放在了Github上面,小伙伴们可以参考下。

地址如下:
https://github.com/XiMu-Demo/Blog-Demo/tree/master/calculateCellHeight

百度 开源的一个自动计算Cell 高度 第三方UITableView-FDTemplateLayoutCell-master

http://blog.sunnyxx.com/2015/05/17/cell-height-calculation/

转载于:https://my.oschina.net/HeroOneHY/blog/1807741

UITableview高度计算相关推荐

  1. ios开源框架——UITableView+FDTemplateLayoutCell优化UITableViewCell高度计算

    前言 这篇文章是我和我们团队最近对UITableViewCell利用AutoLayout自动高度计算和UITableView滑动优化的一个总结.从这篇文章里,你可以读到: UITableView高度计 ...

  2. iOS中的长文本高度计算

    很多的时候如果只是要显示一些简单的短文本,比如确定.取消什么的,一个UILabel就足够了. 但是某些情况下,文本较长.包含这些文本的View的高度取决于文本的高度.比如我们常见的 微博.虽然文本所占 ...

  3. CSS 行内格式化上下文中的各种高度计算

    前言碎碎语:标题问题在昨天困扰了笔者很久很久,早上把问题提到了各网络也暂时没有回复.因为明天要早起飞异地参加一场校招面试,笔者还是很紧张的,但奈何问题不解决寝食难安--所以还是卯起劲重新思考这个问题, ...

  4. 数据结构----二叉树叶子结点到根节点的高度计算

    数据结构----二叉树叶子结点到根节点的高度计算 代码: #include<stdio.h> #include<stdlib.h> typedef struct bstTree ...

  5. element-ui el-table 表格渲染错位以及高度计算错误问题

    前提:在项目中做动态表格,有时表格内容会错位,有时表格高度计算错误 原因:在获得数据之后DOM不重新渲染了,即DOM渲染发生在获取数据之前 解决方法:获取数据之后再让表格重新渲染,在el-table的 ...

  6. MySQL之InnoDB主键索引的B+树的高度计算

    文章目录 MySQL之InnoDB主键索引的B+树的高度计算 1.高度为2和3.主键bigint类型.一行记录数据大小1k MySQL之InnoDB主键索引的B+树的高度计算 1.高度为2和3.主键b ...

  7. 网站首页banner的高度计算

    很快一周又过去了 这周收获到的,工作中的知识点总结 一, 网站首页banner的高度计算 网站首页在设计banner的高度的时候,需要保证一进入页面的时候,屏幕至少能显示一半出来,也就是说banner ...

  8. python画位势高度图_位势高度计算中气压-高度公式的简化及其误差

    位势高度计算中气压高度公式的简化及其误差 崔喜爱 1 顾浩 2 曹云昌 1 [摘 要] 摘要:对高空气象学领域而言 , 位势高度是重要的一个参量,为天气学 和气候学业务应用所提供的高度一般是位势高度. ...

  9. uni-app 顶部导航栏高度计算 + 胶囊高度计算

    uni-app 顶部导航栏高度计算 + 胶囊高度计算 文章目录 uni-app 顶部导航栏高度计算 + 胶囊高度计算 uni-app 一.顶部导航栏高度计算 二.胶囊高度计算 总结 uni-app u ...

最新文章

  1. OpenGL 三角形要点总结
  2. MR8M CANCEL INVOICE后为什么要手工去FI清帐
  3. 201621123085 《Java程序设计》第2周学习总结
  4. 神经网络可视化,真的很像神经元!
  5. 机器学习之支持向量机SVM之python实现ROC曲线绘制(二分类和多分类)
  6. idea创建maven程序_使用Maven程序集创建漏洞评估工件
  7. 白屏优化_今日头条品质优化 图文详情页秒开实践
  8. leetcode45 --- jump
  9. 用计算机写作ppt文库,计算机专业英语Unit 19 计算机专业英语写作.pptx
  10. 手机影音第十三天,xutils3、Glide的使用获取网络图片;下拉、上滑刷新;缓存网络资源...
  11. 担心在机场丢行李?这个日本AI能帮你到处找包
  12. 音视频转换器哪个好?嗨格式视频转换器来了
  13. PL330 DMAC笔记(1) - 简介
  14. 维度数据建模的概念和术语
  15. Integrating Factor
  16. 职业生涯发展理论(精)
  17. 亚马逊补单是怎么做的?
  18. 垃圾填埋场渗滤液厌氧处理过程中沼气的综合利用
  19. 信贷风险定价怎么做?
  20. 思科3750交换机堆叠技术配置向导

热门文章

  1. selenium java项目_1)selenium+ java集成,待深度项目流程应用
  2. java 池化_溯本求源: JAVA线程池工作原理
  3. c# 关于DataTable
  4. python安装xlrd和xlwt及应用
  5. 诗与远方:无题(九十一)
  6. 跨路由器 网段访问rtsp_实验演示:三层交换机与路由器对接
  7. 阿里首推的“SpringBoot+Vue全栈项目”有多牛X?
  8. android cpu 压力测试,两个古董级压力测试工具 leakyapp.exe 和 cpustre.exe
  9. 北京玉渊潭开启春节模式 五大版块吸引游客
  10. nodejs 二进制安装