UITableView中动态返回自定义cell的高度

环境:系统版本:OSX 10.10.2Xcodel版本:6.3.2模拟器:iPhone6   其他:使用MRC

功能:动态返回cell高度

 动态返回cell高度

 使用场景:当cell上的某一个控件(通常是lable),需要根据字符串的长度来决定自身的高度,此时就需要动态返回cell高度,cell的高度最终是cell上各控件的间距以及各控件自身的高度

 第一步:在自定义cell类里,赋值model的方法里面,根据model的某一给定值,来决定这个label自身的高度,通过boundingRectWithSize方法,这个方法里,宽度一定要和label的宽度保持一致,字体大小一定要和label的字体大小保持一致,最终我们所得到的bounds.size.height就是我们根据字符串的长度,返回出来的高度

 第二步:需要在自定义cell类里面,添加一个类方法,专门提供给controller返回行高的方法里调用,用于返回行高的方法要比返回cell的方法先执行,所以我们同样也需要在返回行高的方法里得到model,并最终传入到自动以cell里的类方法中,同样是利用boundingRectWithSize来实现动态返回高度,此时返回的是cell的高度,所以不能仅仅返回bounds.size.height,而需要加上所有控件的间距以及控件自身的高



1.在自定义UITableViewCell中,重写init方法,在里面创建一个Label,frame值可以给zero,因为在动态返回中也会给出

  // 地址label 根据字符串动态返回高度
        // 需要设置 自动换行属性,字体大小属性
        self.addressLabel = [[UILabel alloc]initWithFrame:CGRectZero];
        // 自动换行
        self.addressLabel.numberOfLines = 0;
        // 字体大小
        self.addressLabel.font = [UIFont systemFontOfSize:17];
        self.addressLabel.backgroundColor = [UIColor brownColor];
        [self.contentView addSubview:_addressLabel];
        [_addressLabel release];

label要设置为自动换行,numberOfLines属性,设置为0


2.在返回addressLabel高度的方法中用动态返回,label中的text是通过传过来的model定义的

self.addressLabel.text = model.address;
    CGRect bounds = [model.address boundingRectWithSize:CGSizeMake(100, 1000) options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObject:[UIFont systemFontOfSize:17] forKey:NSFontAttributeName] context:nil];
    self.addressLabel.frame = CGRectMake(10, 90, 100, bounds.size.height);
bounds里的字体要和init方法里的一样(systemFontOfSize:17),让后重新赋值给frame


3.返回整个cell的高度的方法

从controller里传入一个model,根据model.address来决定最后该cell的高度

+ (CGFloat)heightForCell:(Model *)model
{
    // 宽度仍然是限制在100的宽度
    // 而高度是动态返回的
    CGRect bounds = [model.address boundingRectWithSize:CGSizeMake(100, 1000) options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObject:[UIFont systemFontOfSize:17] forKey:NSFontAttributeName] context:nil];
    return 10 + 30 +10 +30 +10 + bounds.size.height + 10;
}
return高度要把cell上所有控件的高度和间隙都加上去


4.在controller返回cell高度的代理方法中,调用上面的方法

首先需要取出该cell对应的model

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    Model *model = self.modelArray[indexPath.row];
    return [MyTableViewCell heightForCell:model];
}

ps:如果一个cell中有多个动态高度的label或其他控件,需要把多个动态高度都加上

第三方控件参考:

FDTemplateLayoutCell,cell需要用自动布局

https://github.com/forkingdog/UITableView-FDTemplateLayoutCell


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值