动态确定tableViewCell的高度

来源:互联网 发布:交控集团网络商学院 编辑:程序博客网 时间:2024/04/30 07:53

如果我们的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的数据源方法).}



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

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

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

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

label的Height(初值为1)

label到上,下的距离

整体的高度

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

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

Height<imageHeigth

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

Height>=imageHeigth

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

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

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

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


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















0 0