iOS UITableview的cell自适应

背景:这几天做项目,又遇到了cell的自适应高度问题

首先我们必须要知道UITableViewcell 的代理执行顺序,在iOS7出现了一个代理方法叫:tableView: estimatedHeightForRowAtIndexPath:,首先我们要知道在使用UITableViewcell的时候必须计算cell的高度,那如果cell的内容是动态的呢?这个时候我们就必须动态的返回高度了,这就回到了我们项目中遇到的问题。知道了这一点,接下来我们就必须知道UITableViewde 的代理方法的执行顺序,分别如下图:

可以看到在执行cellForRowAtIndexPath之前是会先执行heightForRowAtIndexPath的,也就是说有可能cell不存在的时候就调用了heightForRowAtIndexPath,这样是无法满足项目要求的,直到iOS7出现的新的API,这就是上面讲的:tableView: estimatedHeightForRowAtIndexPath:,这个代理方法回给cell的一个预估高度,如果实现了这个方法,也就意味着UITableView的代理方法的执行顺序的改变,如下图:

稍微整理一下就会得到如下结论:

  1. 首先tableView会先向代理拿得到每个cell的预估高度(estimatedHeightForRow...方法),并且拿这个高度去计算整个tableView应该显示的范围
  2. 根据每行预估的高度,算出一屏显示的cell的个数,并先对这些cell(调用cellForRow...方法)进行绘制
  3. 在绘制时拿到cell的真实高度,然后放在heightForRow...方法里面拿给tabelView去用
  4. 屏幕滚动(有cell进入屏幕)的时候,仍然会调用绘制以及获取真实高度的方法.

简单点说,就是预估高度用来让tableView心里有个底,把cell先绘制出来,但最后实际的cell高度还是会从heightForRow...方法中获取.

参考文献:

文/CoderAO(简书作者)
原文链接:http://www.jianshu.com/p/6ab92579fcf1
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

时间: 2024-10-19 22:39:48

iOS UITableview的cell自适应的相关文章

IOS UItableview UIcollectionview cell高度自适应

1.tableviewcell 高度自适应 主要方法: 计算cell高度[cell.contentview systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; // NSLayoutConstraint 使用条件 添加相对约束 ios 7.0 cell 高度计算修改: - (CGFloat)tableView:(UITableView )tableView estimatedHeightForRowAtIndexPath:(NS

iOS UITableView的cell重用标识

转自   http://www.2cto.com/kf/201308/238449.html UITableView继承自UIScrollview,是苹果为我们封装好的一个基于scroll的控件.上面主要是一个个的 UITableViewCell,可以让UITableViewCell响应一些点击事件,也可以在UITableViewCell中加入 UITextField或者UITextView等子视图,使得可以在cell上进行文字编辑. UITableView中的cell可以有很多,一般会通过重用

iOS - UITableView 编辑(cell的插入, 删除, 移动)

UITableView Cell的插入/删除 核心API Class : UITableView Delegate : UITableViewDataSource, UITableViewDelegate 涉及的API:(API的官方详细注释详见本章结尾) /** TableView 进入或退出编辑状态(TableView 方法). */ - (void)setEditing:(BOOL)editing animated:(BOOL)animate /** 确定哪些行的cell可以编辑 (UIT

IOS UITableview 的Cell 封装

感觉不错的代码.收藏下. #import "GDBookTableViewCell.h" #import "GDBook.h" @interface GDBookTableViewCell () @property (weak, nonatomic) IBOutlet UIImageView *iconLabel; @property (weak, nonatomic) IBOutlet UILabel *authorLabel; @property (weak,

iOS UITableView删除cell分割线

UITableView是UITableViewStylePlain风格的,这样整个TableView都会被分割线分隔开,不管有没有数据,非常丑. 为了可以自定义cell的分割线: 解决方案: 将UITableView的separatorStyle属性设置为UITableViewCellSeparatorStyleNone即可,如下: tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

iOS8+ UITableView自动计算cell高度并缓存

这篇文章我们来讲一下UITableView的cell自适应高度,以及遇到的问题的解决办法.在看文章之前希望你已经会UITableView的基本使用了. 先奉上这篇文章的demo的Github地址:UITableViewCellHeightDemo.大家可以下载下来和文章配合看. cell高度计算的历史 在iOS8之前,如果UITableViewCell的高度是动态的,如果想要显示正确的话,我们需要在下面这个UITableView的代理方法中,返回每一行的精确高度: - (CGFloat)tabl

IOS 控件 - UITableView 中的cell 自适应高度

当 UITableView 中有一个 label 的内容比较长的时候,就需要 cell 自适应高度来多行展示label: 首先设置 label 的 line 为0: 代码如下: // 为每一个 cell 预设置一个高度,可以提高效率 - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { return 44; } // 这里每一个 cell

iOS UITableView表视图(3)自定义cell

1.自定义cell 2.多种cell 的混合使用 3.cell自适应高度 自定义cell就是创建一个UITableViewCell的子类. 把cell上的控件创建都封装在子类中,简化UIViewController中的代码 子视图控件添加到cell的contentView上 cell中的控件如何显示Model中的信息? cell中声明一个Model类型的属性,viewController中获取到Model对象后赋值给cell的Model属性,cell中重写Model的setter方法,把Mode

iOS项目开发小技巧 (三) --UITableView实现Cell左划删除等自定义功能

今天来介绍下iOS开发中UITableView的Cell左划实现微信中置顶,删除等功能.该功能在iOS8.0以前是需要很复杂的实现,不过github上应该有现成demo,不过今天介绍的是在iOS8.0以后苹果新推出的api,来实现Cell左划自定义控件. 1. 首先创建UITableView视图,实现其俩个代理,UITableViewDelegate和UITableViewDataSource,该处代码就不说了,主要是俩个回调方法 -(UITableViewCell *)tableView:(U