有时每个tableviewcell中需要显示的文本字数是不确定的,因而需要给cell设置不同高度满足文本的显示,这里总结下常用的计算方法。
1. 手动计算
主要依赖以下方法计算出label的高度,需要给出label的宽度、使用的字体以及NSStringDrawing类别。
CGRect labelRect = [label boundingRectWithSize:CGSizeMake(labelWidth, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOriginattributes:@{NSForegroundColorAttributeName: [UIFont systemFontOfSize:14]} context:nil];
计算出label高度后,手动加入上下边距以及其他控件的高度、间距等数据,可以得到cell高度。
2. 使用tableview自动计算方法
iOS8之后加入了自动计算cell高度的方法,代码也非常简单。
tableView.estimatedRowHeight = 20.0f;
tableView.rowHeight = UITableViewAutomaticDimension;
使用这个方法需要注意,cell中的label需要有确定的边界,一般来说设置好label的宽度,以及与上方、下方的控件之间的间距即可。否则系统计算的结果会有错误。
这个方法使用比较方便,不需要自己进行计算,但是系统计算速度较慢,而且系统只会计算,不会给出cell高度,自己没办法缓存高度数据。
3. 使用- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize
该方法计算可以直接获取cell高度数据,并且进行缓存。
与方法2一样,因为是系统计算高度,需要先确保label有确定的边界,才能得出正确的数据。
//首先,实例化一个cell,这里使用nib获取
textCell = [[[NSBundle mainBundle] loadNibNamed:@"TextTableViewCell" owner:self options:nil] lastObject];
//获取文本数据后,给cell中的label赋值
textCell.label.text = cellLabelText;
//调用方法计算cell高度
CGSize cellSize = [textCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
//计算完所有cell高度并缓存后,传入高度数据刷新tableview即可
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath;
小结
方法2和方法3一般配合nib使用比较方便,注意给label设置好边距即可。