UITableViewCell 高度的自适应

z

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里边的布局又比较复杂,那么第三种不失为一种简单的方法。






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值