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];
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

【iOS知识学习】_iOS动态改变TableView Cell高度

在做tableView的时候,我们有时候需要根据cell的高度动态来调整,最近在网上看到一段代码不错,跟大家Share一下。 在 -(UITableViewCell *)tableView:(UI...

iOS 动态改变cell的高度

#import "ViewController.h"   @interface ViewController () {     UITableView *_table;     NSMuta...
  • saw471
  • saw471
  • 2016年01月28日 12:37
  • 436

iOS开发-UI控件:动态改变UITableView中的Cell高度

文章转自: http://xiaoxuejie.iteye.com/blog/1643044 往往在开发iPhone的应用过程中用得最多的应该算是UITableVIew了,凭着IOS给UIT...

iOS 使用Autolayout实现UITableView的Cell动态布局和高度动态改变

本文翻译自:stackoverflow 有人在stackoverflow上问了一个问题: 如何在UITableViewCell中使用Autolayout来实现Cell的内容和子视图自动...

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

最简单实用的动态返回行高的自定义UITableViewCell
  • horisea
  • horisea
  • 2016年07月25日 18:32
  • 9069

iOS个人整理20-UITableViewCell自定义,cell高度的自适应(纯代码)

UITableViewCell

iOS 轻松实现UITableViewCell 自适应高度

你还在为大量计算cel 高度而烦恼么? 教你轻松搞定自适应高度 IOS8的新特性“self-sizing” Cell要求cell.contentView的四条边都与内部元素有约束关系。 ...
  • saw471
  • saw471
  • 2016年02月19日 15:49
  • 955

iOS开发之多种Cell高度自适应实现方案的UI流畅度分析

本篇博客的主题是关于UI操作流畅度优化的一篇博客,我们以TableView中填充多个根据内容自适应高度的Cell来作为本篇博客的使用场景。当然Cell高度的自适应网上的解决方案是铺天盖地呢,今天我们的...

iOS开发最简单的让你的Cell自适应高度

iOS开发最简单的让你的Cell自适应高度
  • l2i2j2
  • l2i2j2
  • 2016年05月05日 22:57
  • 2983

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

iOS TableView的Cell高度自适应,UILabel自动换行适应 项目的源码下载地址:http://download.csdn.net/detail/swingpyzf...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS cell高度自适应_动态调节cell高度
举报原因:
原因补充:

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