2016-06-01 15:50:39 lincsdnnet 阅读数 2305

从iOS8开始,苹果就可以使用Auto-sizing来自动计算tableView中cell的高度了

一 .照常我们自定义一个cell,并添加了各种约束(具体的自行搞定,因为这跟本文要讲的没什么太大的关系),并设置对应的数据,但不要去计算cell的高度


应用该cell后,发现cell的高度就是默认高度44

 

二 . 接下来只需要两个个步骤即可实现自动计算cell高度

1 . 设置label(里面内容不确定的Label,比如"评论内容")与cell底部的约束,约束我以10为例,如图所示

单单只添加这条约束是不行的,一运行Xcode就会报一堆错,但并不会影响程序的运行.

2 .到应用该cell的tableView.m文件的viewDidLoad方法中,添加如下代码

// cell的高度设置
self.tableView.estimatedRowHeight = 44; // 设置估算高度
self.tableView.rowHeight = UITableViewAutomaticDimension; // 告诉tableView我们cell的高度是自动的

搞定

 

反复强调一点:该方法只适用于iOS8及以上!!!


2015-09-13 17:23:58 iteye_14994 阅读数 135

iOS动态改变TableView Cell高度

我们知道tableview的heightForRowAtIndexPath 会在 cellForRowAtIndexPath 方法之前执行,因此在计算cell高度的时候就不能通过表格的cell来计算,这样就导致动态计算高度变得有点困难。今天在网上找到下面的一种方法:

 

 

创建表格的cell

#pragma mark 表格-创建cell
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString* identifier = @"basis-cell";
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (cell==nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
    }
    
    NSInteger section = indexPath.section;
    
    NSInteger width = [Tool loadScreenSize].width;
    NSInteger height =100+50*section-10;
    
    UIView* view = [[UIView alloc]initWithFrame:CGRectMake(0+1, 0+1, width-2, height)];
    view.backgroundColor=[UIColor grayColor];
    
    UIButton* btn = [Tool createButton:CGRectMake(5, 5, 100, 40) withDelegate:self withAction:nil withTitle:@"button" withBgColor:[UIColor yellowColor]];
    [view addSubview:btn];
    
    [cell.contentView addSubview:view];
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    
    
    [[heights_ objectAtIndex:indexPath.section] setObject:[NSString stringWithFormat:@"%f",view.frame.size.height] atIndex:indexPath.row];

    return cell;
}

 

 

 

表格高度设置,在方法heightForRowAtIndexPath重写中先调用下方法:UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; 先把表格的cell手动生成出来,然后获取其高度。

 

 

#pragma mark 表格-配置cell高度
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    UIView* view = [cell.contentView.subviews objectAtIndex:0];
    NSLog(@"cell.frame.size.height=%f",view.frame.size.height);
    return view.frame.size.height;
}

 

 

 

2015-11-20 18:08:29 Corey_Jia 阅读数 8941

在开发中, 经常碰到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];
}
2017-03-08 19:03:08 xia_haijiao 阅读数 113

iOS cell 高度计算

  • heightForCell:

    • 每一个cell对应一个模型,模型里面有cell的高度,以及对图片frame的重新赋值;
      - (CGFloat)cellHeight
      {
      if (!_cellHeight) {
          // 文字的最大尺寸
          CGSize maxSize = CGSizeMake([UIScreen mainScreen].bounds.size.width - 2 * XMGTopicCellMargin, MAXFLOAT);
          // 计算文字的高度
          CGFloat textH = [self.text boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:14]} context:nil].size.height;
      
          // cell的高度
          // 文字部分的高度
          _cellHeight = XMGTopicCellTextY + textH + XMGTopicCellMargin;
      
          // 根据段子的类型来计算cell的高度
          if (self.type == XMGTopicTypePicture) { // 图片帖子
              if (self.width != 0 && self.height != 0) {
                  // 图片显示出来的宽度
                  CGFloat pictureW = maxSize.width;
                  // 显示显示出来的高度
                  CGFloat pictureH = pictureW * self.height / self.width;
                  if (pictureH >= XMGTopicCellPictureMaxH) { // 图片高度过长
                      pictureH = XMGTopicCellPictureBreakH;
                      self.bigPicture = YES; // 大图
                  }
      
                  // 计算图片控件的frame
                  CGFloat pictureX = XMGTopicCellMargin;
                  CGFloat pictureY = XMGTopicCellTextY + textH + XMGTopicCellMargin;
                  _pictureF = CGRectMake(pictureX, pictureY, pictureW, pictureH);
      
                  _cellHeight += pictureH + XMGTopicCellMargin;
              }
          } else if (self.type == XMGTopicTypeVoice) { // 声音帖子
              CGFloat voiceX = XMGTopicCellMargin;
              CGFloat voiceY = XMGTopicCellTextY + textH + XMGTopicCellMargin;
              CGFloat voiceW = maxSize.width;
              CGFloat voiceH = voiceW * self.height / self.width;
              _voiceF = CGRectMake(voiceX, voiceY, voiceW, voiceH);
      
              _cellHeight += voiceH + XMGTopicCellMargin;
          } else if (self.type == XMGTopicTypeVideo) { // 视频帖子
              CGFloat videoX = XMGTopicCellMargin;
              CGFloat videoY = XMGTopicCellTextY + textH + XMGTopicCellMargin;
              CGFloat videoW = maxSize.width;
              CGFloat videoH = videoW * self.height / self.width;
              _videoF = CGRectMake(videoX, videoY, videoW, videoH);
      
              _cellHeight += videoH + XMGTopicCellMargin;
          }
      
          // 如果有最热评论
          if (self.top_cmt) {
              NSString *content = [NSString stringWithFormat:@"%@ : %@", self.top_cmt.user.username, self.top_cmt.content];
              CGFloat contentH = [content boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:13]} context:nil].size.height;
              _cellHeight += XMGTopicCellTopCmtTitleH + contentH + XMGTopicCellMargin;
          }
      
          // 底部工具条的高度
          _cellHeight += XMGTopicCellBottomBarH + XMGTopicCellMargin;
      }
      return _cellHeight;
      }
  • 返回cell的高度




  • 给子视图传数据

    
    - (void)setTopic:(XMGTopic *)topic
    {
    _topic = topic;
    
    // 新浪加V
    self.sinaVView.hidden = !topic.isSina_v;
    
    // 设置头像
    [self.profileImageView setHeader:topic.profile_image];
    
    // 设置名字
    self.nameLabel.text = topic.name;
    
    // 设置帖子的创建时间
    self.createTimeLabel.text = topic.create_time;
    
    // 设置按钮文字
    [self setupButtonTitle:self.dingButton count:topic.ding placeholder:@"顶"];
    [self setupButtonTitle:self.caiButton count:topic.cai placeholder:@"踩"];
    [self setupButtonTitle:self.shareButton count:topic.repost placeholder:@"分享"];
    [self setupButtonTitle:self.commentButton count:topic.comment placeholder:@"评论"];
    
    // 设置帖子的文字内容
    self.text_label.text = topic.text;
    
    // 根据模型类型(帖子类型)添加对应的内容到cell的中间
    if (topic.type == XMGTopicTypePicture) { // 图片帖子
        self.pictureView.hidden = NO;
        self.pictureView.topic = topic;
        self.pictureView.frame = topic.pictureF;
    
        self.voiceView.hidden = YES;
        self.videoView.hidden = YES;
    } else if (topic.type == XMGTopicTypeVoice) { // 声音帖子
        self.voiceView.hidden = NO;
        self.voiceView.topic = topic;
        self.voiceView.frame = topic.voiceF;
    
        self.pictureView.hidden = YES;
        self.videoView.hidden = YES;
    } else if (topic.type == XMGTopicTypeVideo) { // 视频帖子
        self.videoView.hidden = NO;
        self.videoView.topic = topic;
        self.videoView.frame = topic.videoF;
    
        self.voiceView.hidden = YES;
        self.pictureView.hidden = YES;
    } else { // 段子帖子
        self.videoView.hidden = YES;
        self.voiceView.hidden = YES;
        self.pictureView.hidden = YES;
    }
    // 处理最热评论
    if (topic.top_cmt) {
        self.topCmtView.hidden = NO;
        self.topCmtContentLabel.text = [NSString stringWithFormat:@"%@ : %@", topic.top_cmt.user.username, topic.top_cmt.content];
    } else {
        self.topCmtView.hidden = YES;
    }
    }
2016-07-31 00:42:26 Rotro_Snaker 阅读数 1451

之前看过其他人写的相关博客,有些内容不清楚,或者是没有考虑周全。这里就对这个简单的问题,进行相关的说明。对其中的细节问题,进行相应的解释。

这里主要讨论,当cell中包含image,label,textView三类控件的时候,如何动态计算cell高度。其中image的大小是固定的,label和textView固定宽度后,高度根据内容动态变化。

对cell上的控件添加必要的约束,其中cell的高度与image的大小无关,image的大小固定。cell的子视图label和textView在竖直和水平方向上与cell的距离固定。这样,cell的高度就完全由cell的宽度和label或textView的内容决定。(文章结尾源码中可以查看)

Cell添加约束

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    TableViewCell1 *cell = tableViewCell;
    NSDictionary *dic = _dataArray[indexPath.row];
    cell.textView.text = dic[@"textViewText"];
    cell.label.text = dic[@"labelText"];

    //屏幕宽度-110 = label的宽度
    cell.label.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 110;
    //size 的大小为cell.contentView的大小,
    //在自动计算cell大小时,textView的长宽都是0;
    CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

    //根据textView的内容,计算textView的大小
    CGSize textViewSize = [cell.textView sizeThatFits:CGSizeMake([UIScreen mainScreen].bounds.size.width - 110, FLT_MAX)];

    //由于textView不会影响size的大小,所以比较出一个最大的高度值。
    CGFloat height = size.height + (textViewSize.height);


    height = height > 109 ?height : 109;


    return height + 1;
}

动态计算Cell高度Demo

欢迎评论交流。

没有更多推荐了,返回首页