IOS7环境实现自动计算TableViewCell高度的方法

本文转载于:IOS7环境实现自动计算TableViewCell高度的方法

IOS8的Self Sizing Cells特性大家都很眼馋,这个特性可以省去繁琐的计算Cell高度的代码。可惜只要还需要兼容IOS7等之前的版本,就没法用。我根据Autolayout的原理,推测IOS7也是可以实现这一功能的。
Autolayout规则:view的frame受约束的控制。约束可以直接影响自身的frame,也可以影响其他View的frame。

我的推测:subView与superView的某条边有强约束(固定值的约束),当superView本身对这条边没有设置约束,会以subView的约束为准。

试验:

1、自定义一个Cell,拖一个label。设置cell的上下边与Cell.contentView间距0,其他约束随意。这样,lable对Cell的高度有了一个强约束。设置label的行数为0,高度不设。

2、感谢网友提醒,这里如果是iOS7,还是需要设置Cell的高度,不过可以非常简化,具体做法如下:

a、在ViewController中创建一个Cell的属性或成员变量,专门用于计算Cell高度。(做这一步是为了性能优化)比如self.tempCell

b、改写计算高度的回调

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    id entity = self.dataSourceArray[indexPath.row];
    if (self.tempCell == nil) {
        self.tempCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    }
    self.tempCell.bounds = CGRectMake(0,
                                      0,
                                      CGRectGetWidth(self.tableView.bounds),
                                      CGRectGetHeight(self.tempCell.bounds)
                                      );
    [self.tempCell resetCellWithEntity:entity];

    CGFloat height = [self.tempCell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
    return height > 44 ? height : 44;
}

self.tempCell.bounds = xxxxxx
写这行是因为tempCell创建出来后,默认宽度不一定符合实际情况。

c、在tempCell的resetCellWithEntity:方法中,加入类似这样的代码:

self.testLable.preferredMaxLayoutWidth = self.frame.size.width;

这是因为UILable根据preferredMaxLayoutWidth的值计算高度。默认不设置,表示由系统自动计算。但自动计算仅在iOS8以后有效。iOS7的话,还是需要手动设置的。

3、设置一个数据源,一个NSString的数组,放入长短不同的String进行测试,可以发现显示正常。

示例图

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值