经常查阅资料和自己的研究,现在有一个较为高效的方法。
首先前提条件
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;
}
上面是两个函数。第一个函数是delegate的协议。 第二个是我写的需要用的函数。
其中第二个函数可以重复使用,功能就是返回一个字符串在指定宽度下的实际高度。(包括多行的时候),然后再通过这个高度设置cell的高度
第一个函数就是传回一个自定义的高度值。 先if判断是否此行计算过高度。然后再调入字符串数据,这里是我自己的列子,里面的实际数值是我的约束,为了简单我直接写的数字。大概意思就是计算好高度后,存到字典里,下次调用就直接取字典就行了。
下面是效果图: