iOS cell高度自适应_动态调节cell高度

原创 2015年11月20日 18:08:29

在开发中, 经常碰到cell需要动态调节的情况, 例如聊天页面等, 但是IOS不像Android一样有wrap(wrap就是根据内容的大小,自动调节), 所以在IOS端处理cell高度就蛋疼了
下面介绍三种方法动态调节

方法1-手动计算

在设置cell的model的时候, 调节动态计算cell的高度, 然后再去设置cell的高度
如果你的cell内容比较简单, 就一个label或者cell文字可能多行的label在cell最末端, 那么只需要计算这个label的size, 然后赋值给cell即可:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *ID = @"Cell";
    CGFloat padding = 20;
    CJDemoTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    if (!cell) {
        cell = [[[NSBundle mainBundle] loadNibNamed:@"CJDemoTableViewCell" owner:self options:nil] lastObject];
    }

    CJDemoModel *model = self.models[indexPath.row];
    cell.model = model;
    //此处是个计算size的string分类,后面会附上
    cell.lastLabel.size = [model.testTest sizeWithFont:[UIFont systemFontOfSize:17] maxW:contentLW];
    cell.height = CGRectGetMaxY(cell.lastLabel.frame) + padding;
    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    return cell.height;
}

如果cell多个label可能多行, 那么就需要计算多个label的size, 最好在cell的setModel方法里面进行

//cell setModel方法
- (void)setModel:(CJDemoModel *)model{
    _model = model;
    CGFloat padding = 5;
    self.nameL.text = model.name;
    CGSize nameSize = [self.nameL.text sizeWithFont:[UIFont systemFontOfSize:17]];
    nameSize.frame = CGRectMake(0,0,nameSize.width,nameSize.heigth);

    self.scoreL.text = model.score;
    CGSize scoreSize = [self.scoreL.text sizeWithFont:[UIFont systemFontOfSize:17]];
    scoreL.frame = CGRectMake(0,CGRectGetMaxY(self.nameL.frame),scoreSize.width,scoreSize.heigth);
    self.jobL.text = model.job;
    CGSize jobSize = [self.jobL.text sizeWithFont:[UIFont systemFontOfSize:17]];
    self.jobL.frame = CGRectMake(0,CGRectGetMaxY(self.scoreL.frame),jobSize.width,jobSize.height);

    self.cellHeight = CGRectGetMaxY(self.jobL.frame) + padding;
}

//然后在设置cell的高度(controller)
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    return cell.cellHeight;
}

方法2-FDTemplateLayoutCell

借助框架UITableView-FDTemplateLayoutCell
在- (CGFloat)tableView:(UITableView )tableView heightForRowAtIndexPath:(NSIndexPath )indexPath重新设置下model即可

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
        return = [tableView fd_heightForCellWithIdentifier:ID configuration:^(CJDemoTableViewCell *cell) {
            CJDemoModel *model = self.models[indexPath.row];
            cell.model = model;
        }];
    }
}

github:FDTemplateLayoutCell
如果使用时height返回不正确,请看http://blog.csdn.net/corey_jia/article/details/49232779

方法三-IOS8特性

IOS8中, 提供了动态调节cell高度的方法, 通过XIB添加约束即可, 如果你的应用要适配IOS7及以下, 那么可以参考前两种方法

  • 设置tableView的估算Cell高度&rowHeight值为自动计算模式
- (void)viewDidLoad {
    [super viewDidLoad];

    self.tableView.estimatedRowHeight = 100;  //  随便设个不那么离谱的值
    self.tableView.rowHeight = UITableViewAutomaticDimension;
}
  • 设置约束, 最下面的view要上下左右都设置约束,不然无法计算正确高度
    这里写图片描述

注意: - 不能实现heightForRow代理方法!!!

本文用到的String_category

- (CGSize)sizeWithFont:(UIFont *)font maxW:(CGFloat)maxW
{
    NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
    attrs[NSFontAttributeName] = font;
    CGSize maxSize = CGSizeMake(maxW, MAXFLOAT);

    return [self boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size;

}

- (CGSize)sizeWithFont:(UIFont *)font
{
    return [self sizeWithFont:font maxW:MAXFLOAT];
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

cell高度自适应实现的最简单方式

曾经为了实现cell的高度自适应,不知道吃了多少苦。那个时候,是在我的数据模型model中添加一个height属性,实现它的get方法,在get方法中计算需要多行显示文字的高度,然后再加上其他乱七八糟...

IOS TableView的Cell高度自适应,UILabel自动换行适应

IOS TableView的Cell高度自适应,UILabel自动换行适应 项目的源码下载地址:http://download.csdn.net/detail/swingpyzf/683...

IOS TableView的Cell高度自适应,UILabel自动换行适应

iOS TableView的Cell高度自适应,UILabel自动换行适应 项目的源码下载地址:http://download.csdn.net/detail/swingpyzf...

iOS之如何自适应TableViewCell的高度

1. 问题描述:     在项目中会遇到由于每个cell的图片和文本大小不一致,如果cell的height高度设置不合理的话,对用户体验不是很好。但是如果对cell的height高度设定死之后,当...

iOS中最简单实用的自定义动态返回行高的cell,动态计算cell的高度

最简单实用的动态返回行高的自定义UITableViewCell

iOS UITableView-FDTemplateLayoutCell框架 cell重叠 高度返回0.5问题解决

针对需要动态改变cell高度的需求, 相对来说使用UITableView-FDTemplateLayoutCell框架来解决还是比较便捷的, 他可以支持AutoLayout和 frame layout...

iOS cell高度自适应 - 教你写出优雅的table view

作为一个iOS开发者,自然少不了了table view打交道,table view中最令人头疼的是各种cell的高度计算了,虽然技术上并不难,但是对于自定义cell来说一旦控件比较多,计算起来就会很麻...

iOS 设置label动态高度

- (void)viewDidLoad { [super viewDidLoad]; NSString * content = @"今年2月,中央政治局决定,党的十八届六中全会专题研究全...

使用Autolayout实现自适应UITableViewCell

今天在写医生端,查看报告模块时,发现个人端相同模块的tableViewCell竟然没有自适应,现在更改了题目内容后就成了这个样子: 题目一长就没了 突然想起来年前看到过很简单的使用au...

iOS 8 自适应 Cell,UITableViewAutomaticDimension设置无效,滚动后显示正常

当首次展示表视图时,你会发现一些单元格不能正确调整大小。但是当你滚动表视图时,新单元格的行高是正确的。 你可以强制重载以解决这个问题。 override func viewDidAppear(an...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)