转发 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
版权声明:本文为博主原创文章,转载请附上博文链接!