动态确定tableViewCell的高度

如果我们的cell的大小是固定的当然是可以在下面的方法里面写死

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
   return 100;
}

但是我们的cell往往会根据里面的内容做调整.由于获取height的方法实在生成cell之前,一开始的做法是在得到cell的数据时候一并根据数据计算出cell中各个控件的frame(cell的Height当然也出来了),一并传给cell,计算出来的Height用于放到heightForRowAtIndexPath的方法中去,这样cell内部的计算方法跑到外面去实现了,封装不好.现在有一种做法是利用自定义的cell实现一个类方法,将我们对应cell的数据传给这个方法,有这个方法计算出我们的table的高

形如:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
   return [codeCell cellHeigt:[self.array[indexPath.row] floatValue]];//codecell是自定义的cell cellHeight:是计算高度的类方法 Array 存存的是初始化cell的信息
}

这样就能够让cell根据 自己的情况计算出高度来了.


如果我们使用xib来建立cell我们就没有办法在类方法中得知cell的一些信息,这时我们就需要实例化我们的cell,然后把cell的高度返回给cellHeight的数据源

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellStr=@"cell";
    InfoCell *cell=[tableView dequeueReusableCellWithIdentifier:cellStr];
    if (!cell){
        cell=[[[NSBundle mainBundle] loadNibNamed:@"InfoCell" owner:nil options:nil] lastObject];
    }
    
    Model *model=self.allArr[indexPath.row];
    cell.model=model;
    cell.selectionStyle=UITableViewCellSelectionStyleNone;
    return cell.contentView.height;
}

cell.contentView.height值是需要在setmodel里面根据当前的数据进行修改的.

-(void)awakeFromNib
{
    //当我们的cell被新建出来,就会调用我们的这个方法,我们可以在这里得到xib中的一些布局的初始值(需要变动的约束,或者拿来作为参考的约束)
}


-(void)setModel:(Model *)model
{
    //在这里我们根据model的内容得到我们的控件应该怎样去变动,把所有需要变动的约束在这里更新,,这样我们的cell布局就会发生变化,最后吧cell.contentView.height
设置成合适的大小.(这个值会传递回cellHeight的数据源方法).
}

动态确定tableViewCell的高度_第1张图片


如果我们实现这样的一个效果的话,左边有一个固定尺寸的图片,右边是一个有固定宽度和动态高度的UILabel,当我么label的内容小于图片高度的时候我们不拉伸cell,并且让label的垂直居中显示,当label的值超过图片高度的时候我们就让cell的高度拉伸,同事保证label和image位于cell中间的位置.

首先我们明切,我们应该怎样设置约束,我们会用到什么约束.

image距离上面的垂直高度,(用于调整image的位置)

image自身的Height(用来衡量labei的Height)

label的Height(初值为1)

label到上,下的距离

整体的高度

以上的值都可以在wakeformnib里面的到初始的值,

然后根据label的内容计算出Heigh,作为一个变量

Height

调整label到上,下的距离的约束,(初始值-Height/2)

Height>=imageHeigth

调整label到上,下的距离的约束,(初始值-imageHeight/2)

调整image距离上面的垂直高度(初始值+(Height-imageHeight)/2)

调整整体的高度,(初始值+Height-imageght);

调整contentView的高度=整体的高度


具体的情况,会有具体的做法.















你可能感兴趣的:(动态确定tableViewCell的高度)