【iOS】UITableView的动态Cell高度(Masonry)


评论长度不同引出的问题

对于之前写的项目的评论部分,由于评论文字字数的不同会导致label高度不同,所以需要设定不同的cell高度来展示。

一开始使用了

CGSize labelSize = [label.text boundingRectWithSize:CGSizeMake(Width - 40 - 50 , MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:17]} context:nil].size;

这个方法得到的labelSize.height就是计算得到的高度。这样以来将每个评论都计算一次,用数组存储,待到需要时遍历数组取出就好了。

这样并不是很方便,尤其是有的评论有回复,有的没有回复,这样就需要计算回复的label高度再做判断,更加麻烦。

所以这时候就体现了Masonry的方便

实现

对于tableViewCell的动态高度,首先设定好tableView的属性:

	self.tableView.estimatedRowHeight = 200;
    self.tableView.rowHeight = UITableViewAutomaticDimension;

estimateRowHeight是预估高度,是还没有加载好评论时的cell高度,当评论的高度已经确定,cell会刷新高度。

UITableViewAutomaticDimension就是把cell的行高设为自动(变化的)尺寸

对自定义cell,要将masonry设定的约束写到

- (instancetype) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

写到这个方法内部

如下:

 	self.content = [[UILabel alloc] init];
    [self.contentView addSubview: self.content];
    [self.content mas_makeConstraints:^(MASConstraintMaker *make) {
        //由于要自适应的cell,所以不用宽高约束
        make.left.equalTo(self.author).with.offset(0);
        make.top.equalTo(self.contentView).with.offset(50);
        make.right.equalTo(self.contentView).with.offset(-40);
        make.bottom.equalTo(self.labelReply.mas_top).offset(0);
    }];

	self.labelReply = [[UILabel alloc] init];
    [self.contentView addSubview:self.labelReply];
	[self.labelReply mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.content.mas_left).with.offset(0);
        make.right.equalTo(self.content.mas_right).with.offset(0);

        make.top.equalTo(self.content.mas_bottom).with.offset(0);

        make.bottom.equalTo(self.time.mas_top).offset(-15);
    }];

这样就是把content和labelReply设置为左右对齐,上下紧贴的两个label,并且会自动生成高度,无需任何计算。

另外对于tableView,下面这个设定行高的方法就不需要了,也不建议去写,很有可能出错。

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

请添加图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值