如果我们的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的高度=整体的高度
具体的情况,会有具体的做法.