这篇文章主要用于兼容iOS7系统,在iOS8以上直接一句代码系统就可以帮你算出cell的高度,有兴趣的朋友可以自己搜下。以下列出这个例子的代码流程
常规的创建一个控制器带一个tableview视图,在控制器.m文件中传递模型数据,这里注意下:在模型中加入一个存储cell高度的属性用于缓存cell高度,增强视图滑动的流畅性。
-
通过xib自定义一个cell,在这个例子中的cell上加一个UILabel,并设置上下左右的约束。
在cell中有一个很重要的操作,UILable多行时必须设置preferredMaxLayoutWidth属性,不然系统无法确定UILabel的宽度
self.aLabel.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width-16;
- 实现tableview代理方法1,这个方法可以避免一初始化控制器系统就计算全部cell的高度,消耗资源,使用这个方法好处就是系统只会先算显示在屏幕的cell高度.
-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
- 实现代理方法2,这个是重头戏,主要用到systemLayoutSizeFittingSize:这个方法就可以得到cell的高度
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (_prototyCell == nil) {
_prototyCell = [tableView dequeueReusableCellWithIdentifier:@"Custom"];
}
DataEntity *dataEntity = self.dataSource[indexPath.row];
if (dataEntity.cellH<=0) {
_prototyCell.aLabel.text = dataEntity.title;
dataEntity.cellH = [_prototyCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height+0.5;
}
return dataEntity.cellH;
}
写这篇文章是为了记录自己学习这个的过程,学习这个主要是在这里看到lishichao706的专栏,这个作者写得很详细,有兴趣可以去看看