转发 UITableViewCell使用Masonry进行自动计

2019-07-14  本文已影响0人  金天动地

文章参照: https://blog.csdn.net/kuangdacaikuang/article/details/52869095
总结下:

Masonry进行cell自动计算行高第一步

// 在含tableView 控制器
- (void)viewDidLoad {
    [super viewDidLoad];
    //设置自动计算行号模式
    self.tableView.rowHeight = UITableViewAutomaticDimension;
    //设置预估行高
    self.tableView.estimatedRowHeight = 200;
}

Masonry进行cell自动计算行高第二步

//自定义cell
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
    //图片
        UIImageView *imgview = [[UIImageView alloc] init];
        //注意点:  一定要添加到self.contentView上
        [self.contentView addSubview:imgview];
        self.imgview = imgview;
        //标题
        UILabel *titleLabel = [[UILabel alloc] init];
        titleLabel.textColor = [UIColor colorWithRed:251.0/255 green:177.0/255 blue:84.0/255 alpha:1.0];
        titleLabel.font = [UIFont systemFontOfSize:18.0];
        [self.contentView addSubview:titleLabel];
        self.titleLabel = titleLabel;
        //内容
        UILabel *detailLabel = [[UILabel alloc] init];
        //关键的第二步
        //1.numberOfLines 设置为0,label的文本会自动换行
        detailLabel.numberOfLines = 0;
        //2.设置换行的模式,CharWrapping是以字符作为分割,WordWrapping是以单词作为分割,英文label特别明显(WordWrapping,保证单词完整,若单词在一个句子尾部无法正常显示换行)
        detailLabel.lineBreakMode = NSLineBreakByCharWrapping;
        detailLabel.font = [UIFont systemFontOfSize:13.0];
        detailLabel.textColor = [UIColor colorWithRed:72.0/255 green:68.0/255 blue:69.0/255 alpha:1.0];
        [self.contentView addSubview:detailLabel];
        self.detailLabel = detailLabel;
    }
    return self;
}

两种线段模式截图如下


image.png

Masonry进行cell自动计算行高第三步

// layoutSubviews布局里的重点(控制在此方法有值,且Frame也有)
- (void)layoutSubviews {
    [super layoutSubviews];
    //所有子控件,都要依赖与self.contentView作为约束父控件,而不是self(cell)
    [self.imgview mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerY.mas_equalTo(self.contentView.mas_centerY);
        make.left.mas_equalTo(self.contentView.mas_left).offset(34);
        make.width.height.mas_equalTo(70);
    }];
    [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(self.contentView.mas_top).offset(15);
        make.left.mas_equalTo(self.imgview.mas_right).offset(24);
        make.right.mas_equalTo(self.contentView.mas_right).offset(-20);
    }];
   // lable内自动调整高度.
    [self.detailLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(self.titleLabel.mas_bottom).offset(13);
        make.left.mas_equalTo(self.imgview.mas_right).offset(24);
        make.right.mas_equalTo(self.contentView.mas_right).offset(-25);
        //MARK:自动计算行高第四步---根据大家反映,更新后的代码
        make.bottom.mas_equalTo(self.contentView.mas_bottom).offset(-10);
    }];

    //MARK:自动计算行高第四步------Xcode 7.3下这样处理没问题,但是升级到Xcode 8.0后就不行了
//    [self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
//        make.top.mas_equalTo(self.mas_top);
//        make.left.mas_equalTo(self.mas_left);
//        make.right.mas_equalTo(self.mas_right);
//        make.bottom.mas_equalTo(self.detailLabel.mas_bottom).offset(10);
//    }];

}

最关键的一步 [cell layoutIfNeeded];

Masonry进行cell自动计算行高第四步

//控制器初始化cell的时候
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    if (indexPath.section == 0) {
        JDGGoldPacketsCell *cell = [tableView dequeueReusableCellWithIdentifier:@"JDGGoldPacketsCell" forIndexPath:indexPath];
        if (cell == nil) {
            cell = [[JDGGoldPacketsCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"JDGGoldPacketsCell"];
        }
        self.goldPacketsCell = cell;
        //最关键的一步,解决不正常显示问题
        [cell layoutIfNeeded];
        return cell;
    }else {
        JDGGoldDetailCell *cell = [JDGGoldDetailCell cellWithTableView:tableView];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cell.aboutRedPackets = self.aboutRedPacketsArr[indexPath.row];
        //最关键的一步,解决不正常显示问题
        [cell layoutIfNeeded];
        return cell;
    }
}

感谢作者条理清晰,让我对自动行高有更清晰认识.

作者:上进求知,认真思辨
来源:CSDN
原文:https://blog.csdn.net/kuangdacaikuang/article/details/52869095
版权声明:本文为博主原创文章,转载请附上博文链接!

上一篇 下一篇

猜你喜欢

热点阅读