经常查阅资料和自己的研究,现在有一个较为高效的方法。
首先前提条件
1. Cell 用xib方式自定义。 内嵌有 icon头像 labelview多行文本框
2. 导致高度变化的就是这个多行文本框,需要手动判断高度。
方法: 1 . Cell 采取xib绘图的方式,把其余不变控件约束好, 重点把labelview的上下 top和bottom 对 cell的contentview做好约束,这样为了保证高度计算后自动拉伸多行。
2. 代码编写
首先是设置多行参数
titleLabel.numberOfLines = 0;
本文适用于已经掌握基本的自定义cell的同学。我也是做个笔记。重点在自适应高度。在Cell自定义初始化后。
3.
@property (nonatomic, strong) NSMutableDictionary *indexToHeight;为了提高效率 不用每次都计算高度这里用字典存起来
- (void)viewDidLoad { [super viewDidLoad]; self.tableView.dataSource = self; self.tableView.delegate = self; self.indexToHeight = [[NSMutableDictionary alloc] init]; }
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if ([self.indexToHeight objectForKey:[NSNumber numberWithInteger:indexPath.row]] == nil) { float offset = 84; CMessage *mes = self.mesList[indexPath.row]; UIScreen *screen = [UIScreen mainScreen]; float mesHeight = [self fontWidth:mes.text fontSize:16 width:screen.bounds.size.width - 86]; [self.indexToHeight setObject:[NSNumber numberWithInteger:offset + mesHeight] forKey:[NSString stringWithFormat:@"%ld",indexPath.row]]; } NSNumber *num = [self.indexToHeight objectForKey:[NSString stringWithFormat:@"%ld",indexPath.row]]; return num.intValue; } - (CGFloat)fontWidth:(NSString *)src fontSize:(float)size width:(float)width { return [src boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:size]} context:nil].size.height; }
其中第二个函数可以重复使用,功能就是返回一个字符串在指定宽度下的实际高度。(包括多行的时候),然后再通过这个高度设置cell的高度
第一个函数就是传回一个自定义的高度值。 先if判断是否此行计算过高度。然后再调入字符串数据,这里是我自己的列子,里面的实际数值是我的约束,为了简单我直接写的数字。大概意思就是计算好高度后,存到字典里,下次调用就直接取字典就行了。
下面是效果图: