关于TableViewCell高度自适应问题的整理
TableViewCell高度自适应在网上有很多资料,我只想找出最最最简单的一种方法。
首先梳理一下思路。说到TableViewCell我们第一个想到的问题或许就是cell的复用问题。
1. [self.tableView registerClass:[Cell class] forCellReuseIdentifier:str];注册之后可以在cell代理函数里调用
Cell *cell = [tableView dequeueReusableCellWithIdentifier:str forIndexPath:indexPath];方法去对cell进行设置,操作,无需再进行复用处理。
2.没有进行register注册的需要先判断复用队列里有没有cell
Cell *cell = [tableView dequeueReusableCellWithIdentifier:str ];
if (!cell) {
cell = [[Cell alloc]initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:str];
}
3.在cellForRowAtIndexPath函数里尽量不要去做添加控件的操作。因为,在if函数内添加,会出现数据重叠问题;而在if外面添加,会出现复用问题,黑乎乎一大片。如果确实需要,可以考虑自定义cell方法。分为纯代码和xib两种方式,纯代码方式建立的是Class类,而xib方式创建的是nib类。
cell高度自适应
1.如果我们想要在cell里面新建lable并且使其自适应高度,那么只能新建Class类(其实是我没找到可以用的nib解决方法)。初始化的时候添加控件,设置或者不设置其frame都可以,因为我们在下面会进行重新设置其frame。否则容易在断行方面出问题
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
_lable = [[UILabel alloc]initWithFrame:CGRectMake(, , maiSrc.width, )];
[self addSubview:_lable];
_imgv = [[UIImageView alloc]init];
[self addSubview:_imgv];
}
return self;
}
2.在cellForRowAtIndexPath方法里不能直接对Cell对象进行赋值,那么我们可以建立对象方法来进行设置。当然,记得在.h文件里声明这个对象方法。
#import "Cell.h" static CGFloat heightForCell ;
static CGFloat widthForCell ; @implementation Cell -(void)setHeightForLable:(NSString *)str fontForLable:(CGFloat)font CGSize:(CGSize)constraintSize{ //文字高度计算方法
CGFloat height = [[MineJN defaultMineJN] autoLayouHeightForLable:str fontSize:font constrainSize:CGSizeMake(maiSrc.width - widthForCell, CGFLOAT_MAX)]; heightForCell = heightForCell > height ? heightForCell : height; self.lable.text = str; self.lable.numberOfLines = ; self.lable.frame = CGRectMake(self.lable.frame.origin.x, self.lable.frame.origin.y, maiSrc.width - widthForCell, heightForCell); //获取自身高度 然后将计算出来的高度赋值给他
CGRect frame = [self frame]; frame.size.height = heightForCell; self.frame = frame;
}
3.文字高度计算方法是我工具类里的方法
-(CGFloat)autoLayouHeightForLable:(NSString *)lableText fontSize:(CGFloat)fontSize constrainSize:(CGSize)maxSize{
CGSize constraintSize;
//对比最大约束maxSize与CGSizeZero是否相等,如果是的话给他赋一个初值。以无限高为最大高度,以屏幕宽-30为宽度。如果不相等可以直接沿用
if (CGSizeEqualToSize(maxSize, CGSizeZero)) {
constraintSize = CGSizeMake(maiSrc.width, CGFLOAT_MAX);
}else{
constraintSize = maxSize;
}
//计算方式 记得一般情况要有Origin
NSStringDrawingOptions options = NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin;
/*
*字符串计算方式,NSStringDrawingUsesLineFragmentOrigin是以每行组成的矩形为单位计算整个文本的尺寸
*UsesFontLeading则以字体间的行距(leading,行距:从一行文字的底部到另一行文字底部的间距。)来计算。
*如果为NSStringDrawingTruncatesLastVisibleLine那么计算文本尺寸时将以每个字或字形为单位来计算。
*如果为NSStringDrawingUsesDeviceMetric,那么计算文本尺寸时将以每个字或字形为单位来计算。
*/
//设置字符串字体号,字体颜色
NSDictionary *dic = [NSDictionary dictionaryWithObjects:@[[UIFont systemFontOfSize:fontSize],[UIColor blueColor]] forKeys:@[NSFontAttributeName,NSForegroundColorAttributeName]];
//iOS7以后用这个方法来计算lable自定义高度
CGRect stringRect = [lableText boundingRectWithSize:constraintSize options:options attributes:dic context:nil];
return stringRect.size.height;
}
4.写完cell的对象方法,并且其中lable的各种属性以及赋值情况都设置完成,那就可以到cellForRowAtIndexPath方法里去调用了
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
Cell *cell = [tableView dequeueReusableCellWithIdentifier:str];
//获取数据源
Info *io = _dataArr[indexPath.row];
if (!cell) {
cell = [[Cell alloc]initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:str];
}
[cell setHeightForLable:io.intro fontForLable: CGSize:CGSizeMake(maiSrc.width, CGFLOAT_MAX)];
return cell;
}
完了。这份代码说的比较简单,只是给出了一个思路,具体怎么实现,还需要你自己去动脑子思考,纯粹的拿来主义很无聊,不管你在多久之后才看到这篇文章,都希望你能在遇到问题,看别人文章的时候进行认真思考。
关于TableViewCell高度自适应问题的整理的更多相关文章
- 让tableView的高度等于contentSize的高度、动态调整tableView的高度、tableView的高度自适应布局
文章概要: 1.简介下,tableView中的内容如何高度自适应的布局 2.如何做到让tableView的高度动态调整 还是看图作文吧- 首先,tableView的高度就是用户能够看见里面更大世界的那 ...
- iframe高度自适应(同域)
今天解决了iframe高度自适应的问题,不过这只是同域下的页面嵌入,以下是代码: function SetCwinHeight(){ var iframeid = document.getElemen ...
- 兼容firefox的iframe高度自适应代码
网上关于iframe高度自适应的代码有很多,但比较杂乱,本文根据实用性整理了以下代码: JavaScript部分: 折叠JavaScript Code复制内容到剪贴板 <script type= ...
- UITableViewCell 高度自适应
UITableViewCell 高度自适应一直是我们做动态Cell高度时遇到的最烦躁的问题,Cell动态高度计算可以去看看sunny的这篇文章介绍,今天主要和大家分享下我在使用systemLayout ...
- 四种方法解决DIV高度自适应问题
本文和大家重点讨论一下解决DIV高度自适应的方法,这里主要从四个方面来向大家介绍,相信通过本文学习你对DIV高度自适应问题会有更加深刻的认识. DIV高度自适应 关于DIV高度的自适应,一直是个让人头 ...
- SnapKit swift实现高度自适应的新浪微博布局
SnapKit swift版的自动布局框架,第一次使用感觉还不错. SnapKit是一个优秀的第三方自适应布局库,它可以让iOS.OS X应用更简单地实现自动布局(Auto Layout).GtiHu ...
- 高度自适应的bug
今天在整理之前IFEde作业,发现有个简历的效果好像没实现.于是想把样式改成作业要求的那样. 作业要求是这样的: 右边栏昨晚高度是839px,我想把左边栏做成高度自适应的.但是没成功.现在我把这个问题 ...
- css--常见左右盒子高度自适应布局
前言 前端开发工程师最基础的技能要求是根据 ui 设计稿还原网页,这就缺少不了必要的网页布局,首先看下最近小伙伴问我的一个问题,他说一个网页有左右两个部分,左右两个部分的高度都不固定,要使得右部分的宽 ...
- iOS开发之多种Cell高度自适应实现方案的UI流畅度分析
本篇博客的主题是关于UI操作流畅度优化的一篇博客,我们以TableView中填充多个根据内容自适应高度的Cell来作为本篇博客的使用场景.当然Cell高度的自适应网上的解决方案是铺天盖地呢,今天我们的 ...
随机推荐
- JDBC笔记
简介 JDBC是Java规定的访问数据库的API,目前主流的数据库都支持JDBC.使用JDBC访问不同的数据库时需要安装不同的驱动. JDBC定义了数据库的链接,SQL语句的执行以及查询结果集的遍历等 ...
- MFC DLL资源动态切换
在MFC使用过程中,遇到DLL资源与主EXE资源冲突问题. 出现这样的Bug,一时无从下手. 报错位置在核心代码中dlgcore.cpp. [cpp] view plaincopy BOOL AFXA ...
- 《我是一只IT小小鸟》 读后感
<我是一只IT小小鸟>一只是我想读list中一个本,但是上次去当当买的时候,竟然缺货了...昨天监考,实在无聊,就上网看电子书了,一天就看完了,看得有点仓促,所以理解估计不深. 1.刘帅: ...
- poj1799---解析几何
sin(a)=r/R-r,反三角asin(r/R-r),乘以2n=2pi,去化简,得到r 收获:define pi acos(-1) 这样pi的精度会高很多<math.h>(cos,sin ...
- ocx控件获取使用App的窗口句柄
在CXxxCtrl文件中 HWND hAppWnd = NULL; if (m_pInPlaceSite != NULL) m_pInPlaceSite->GetWindow(&hApp ...
- 剑指offer26 复杂链表的复制
/* struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : ...
- DZY的根(思维水)
DZY的根[问题描述]DZY是个没有根的人,他十分想要有根,这样才能...智商爆表的计算机大神WJC决定再帮帮他,他用程序制造了N个根——有生命的根!这N个根和WJC一样都十分机智,他们要参加国际象棋 ...
- 枚举与剪枝_观察算式(比标准答案还要牛B)
观察算式 观察以下的算式: △△△ * △△ = △△△△ 某3位数乘以2位数,结果为4位数 要求:在9个△所代表的数字中.1~9的数字恰好每一个出现1次. 暴力破解代码: package lianx ...
- 应用程序正常初始化(0xc015002)失败解决方法
VS2005 sidebyside manifest error Microsoft.VC80.MFC Microsoft.VC80.CRT Microsoft.VC80.MFCLOC msvcr80 ...
- ovs 实用案例
建立gre,xvlan:http://networkstatic.net/configuring-vxlan-and-gre-tunnels-on-openvswitch/ vm之间通过gre通信:h ...