对UITableViewCell高度自适应并缓存
由于最近需要做一个类似微信聊天窗口的功能,牵涉到
UITableViewCell
的高度自适应,同时需要准确获取UITableView
的contentSize
并做相应的滚动和动画,在反复尝试使用系统自适应和FDTemplateLayoutCell均有一些小问题待处理,代码计算又太麻烦,故尝试自己实现。
- 系统自动计算无法满足准确获取
contentSize
。 - FDTemplateLayoutCell计算不准且似乎在
iOS10.2.1
会崩溃。 - 代码主动计算太繁琐而且容易错。
- 部分代码暂未优化,以后会优化。
- 准备让代码稳定后弄Cocoapods。
获取高度的方法如下即可,而且这里有
4种Cell
同时做了一些测试操作,真实项目中一种Cell
只需一行代码搞定一切问题。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row % 4 == 0) {
return [tableView bm_heightForCellWithCellClass:TableViewCell.class cacheByIndexPath:indexPath configuration:^(__kindof TableViewCell *layoutCell) {
layoutCell.LABEEE.text = self.dataArray[indexPath.row];
}];
} else if(indexPath.row % 4 == 1){
return [tableView bm_heightForCellWithCellClass:BMOneCell.class cacheByIndexPath:indexPath configuration:^(__kindof BMOneCell *layoutCell) {
layoutCell.descLabel.text = self.dataArray[indexPath.row];
}];
} else if(indexPath.row % 4 == 2){
return [tableView bm_heightForCellWithCellClass:BMTwoCell.class cacheByIndexPath:indexPath configuration:^(__kindof BMTwoCell *layoutCell) {
layoutCell.label1.text = self.dataArray[indexPath.row];
layoutCell.label2.text = self.dataArray[indexPath.row];
}];
} else {
return [tableView bm_heightForCellWithCellClass:BMImageViewCell.class cacheByIndexPath:indexPath configuration:^(__kindof BMImageViewCell *layoutCell) {
layoutCell.labelLabel.text = self.dataArray[indexPath.row];
if (indexPath.row % 3 == 0) {
layoutCell.iconImageView.image = [UIImage imageNamed:@"001"];
} else if (indexPath.row % 3 == 1){
layoutCell.iconImageView.image = [UIImage imageNamed:@"002"];
} else {
layoutCell.iconImageView.image = [UIImage imageNamed:@"003"];
}
}];
}
}