z
这个是一个比较好的方法,因为heightForRow在整个tableView调用很频繁,当cell很多,并且计算比较耗时时(比如你要做一个比朋友圈还复杂的东西时)你可以开线程进行计算,然后放到一个数组(字典),那么就不会造成主线程卡死
这样计算不用让cell的4边都有限制,如果限制会有冲突,但是你会发现cell没有完全适配,因为还要在cell里告诉cell他多宽,因为视图还没创建时,storyboard以为他的宽度是600,当然也可以给label拉一个宽的约束,限制label的宽度,
1.使用代码进行计算
一般做cell自适应的时候,如果不是很复杂,都可以通过代码计算文字所占的高度,
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSDictionary *dic = @{NSFontAttributeName : [UIFont systemFontOfSize:15]};// 设置字体
CGRect rect = [_dataSourceStr boundingRectWithSize:CGSizeMake(kScreenW - 40, 1000000) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil];// options 一般NSStringDrawingUsesLineFragmentOrigin就可以返回和合适的高度,
return rect.size.height + 90;// 文字所占高度加上别的控件所占高度
}
这个是一个比较好的方法,因为heightForRow在整个tableView调用很频繁,当cell很多,并且计算比较耗时时(比如你要做一个比朋友圈还复杂的东西时)你可以开线程进行计算,然后放到一个数组(字典),那么就不会造成主线程卡死
2.autolayout计算(iOS8)
这个就超简单了在viewDidLoad里面写个这个就行了
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 100.0; // 这是一个估算cell高度的方法,不知道为什么不写这个方法就无法返回正确高度,但是只在iOS8以后适用
// 不要写这个方法了
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
不过现在App大多从iOS7适配,所以适用性不强,所以就没好好研究这个哦,就是设置约束时要注意让cell的4边必须有约束来限制,
3.autolayout计算(无限制)
这种方法是让autolayout告诉你这个cell应该多高
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
YDTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ydcell"];
cell.contentL.text = _dataSourceStr;
[cell layoutIfNeeded];// 必须实现这个,告诉cell布局改变
return CGRectGetMaxY(cell.contentL.frame) + 5;
}
这样计算不用让cell的4边都有限制,如果限制会有冲突,但是你会发现cell没有完全适配,因为还要在cell里告诉cell他多宽,因为视图还没创建时,storyboard以为他的宽度是600,当然也可以给label拉一个宽的约束,限制label的宽度,
- (void)awakeFromNib {
CGRect frame = self.bounds;
frame.size.width = kScreenW;
self.bounds = frame;
}
注意:这种方法是非常耗性能的,并且也不能开线程,如果太多cell,会造成主线程长时间卡顿假死。如果经常刷新整个tableView,更是会使整个APP体验差很多,一种是自己写个缓存,刷新的时候取缓存就行了,但是也不好搞。
总结:如果写一个拥有很多cell的,建议用第一种,因为性能很容易优化。如果只有几个cell,cell里边的布局又比较复杂,那么第三种不失为一种简单的方法。