环境:系统版本:OSX 10.10.2Xcodel版本:6.3.2模拟器:iPhone6 其他:使用MRC
功能:动态返回cell高度
动态返回cell高度
使用场景:当cell上的某一个控件(通常是lable),需要根据字符串的长度来决定自身的高度,此时就需要动态返回cell高度,cell的高度最终是cell上各控件的间距以及各控件自身的高度
第一步:在自定义cell类里,赋值model的方法里面,根据model的某一给定值,来决定这个label自身的高度,通过boundingRectWithSize方法,这个方法里,宽度一定要和label的宽度保持一致,字体大小一定要和label的字体大小保持一致,最终我们所得到的bounds.size.height就是我们根据字符串的长度,返回出来的高度
第二步:需要在自定义cell类里面,添加一个类方法,专门提供给controller返回行高的方法里调用,用于返回行高的方法要比返回cell的方法先执行,所以我们同样也需要在返回行高的方法里得到model,并最终传入到自动以cell里的类方法中,同样是利用boundingRectWithSize来实现动态返回高度,此时返回的是cell的高度,所以不能仅仅返回bounds.size.height,而需要加上所有控件的间距以及控件自身的高
1.在自定义UITableViewCell中,重写init方法,在里面创建一个Label,frame值可以给zero,因为在动态返回中也会给出
// 地址label 根据字符串动态返回高度
// 需要设置 自动换行属性,字体大小属性
self.addressLabel = [[UILabel alloc]initWithFrame:CGRectZero];
// 自动换行
self.addressLabel.numberOfLines = 0;
// 字体大小
self.addressLabel.font = [UIFont systemFontOfSize:17];
self.addressLabel.backgroundColor = [UIColor brownColor];
[self.contentView addSubview:_addressLabel];
[_addressLabel release];
label要设置为自动换行,numberOfLines属性,设置为0
self.addressLabel.text = model.address;
CGRect bounds = [model.address boundingRectWithSize:CGSizeMake(100, 1000) options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObject:[UIFont systemFontOfSize:17] forKey:NSFontAttributeName] context:nil];
self.addressLabel.frame = CGRectMake(10, 90, 100, bounds.size.height);
bounds里的字体要和init方法里的一样(systemFontOfSize:17),让后重新赋值给frame
3.返回整个cell的高度的方法
从controller里传入一个model,根据model.address来决定最后该cell的高度
+ (CGFloat)heightForCell:(Model *)model
{
// 宽度仍然是限制在100的宽度
// 而高度是动态返回的
CGRect bounds = [model.address boundingRectWithSize:CGSizeMake(100, 1000) options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObject:[UIFont systemFontOfSize:17] forKey:NSFontAttributeName] context:nil];
return 10 + 30 +10 +30 +10 + bounds.size.height + 10;
}
return高度要把cell上所有控件的高度和间隙都加上去
4.在controller返回cell高度的代理方法中,调用上面的方法
首先需要取出该cell对应的model
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
Model *model = self.modelArray[indexPath.row];
return [MyTableViewCell heightForCell:model];
}
ps:如果一个cell中有多个动态高度的label或其他控件,需要把多个动态高度都加上
第三方控件参考:
FDTemplateLayoutCell,cell需要用自动布局
https://github.com/forkingdog/UITableView-FDTemplateLayoutCell