iOS UI设计: 在Autolayout自适应的情况下tableviewcell高度自适应

时间:2021-08-15 19:33:34

经常查阅资料和自己的研究,现在有一个较为高效的方法。

首先前提条件

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判断是否此行计算过高度。然后再调入字符串数据,这里是我自己的列子,里面的实际数值是我的约束,为了简单我直接写的数字。大概意思就是计算好高度后,存到字典里,下次调用就直接取字典就行了。

下面是效果图:

iOS UI设计: 在Autolayout自适应的情况下tableviewcell高度自适应