如果我们的cell的大小是固定的当然是可以在下面的方法里面写死
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 100;
}
形如:
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [codeCell cellHeigt:[self.array[indexPath.row] floatValue]];//codecell是自定义的cell cellHeight:是计算高度的类方法 Array 存存的是初始化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 调整label到上,下的距离的约束,(初始值-Height/2) Height>=imageHeigth 调整label到上,下的距离的约束,(初始值-imageHeight/2) 调整image距离上面的垂直高度(初始值+(Height-imageHeight)/2) 调整整体的高度,(初始值+Height-imageght); 调整contentView的高度=整体的高度 具体的情况,会有具体的做法.