UITableView根据表格内容进行高度自适应与使用Masonry实现根据内容进行宽度自适应和高度自适应

32 篇文章 0 订阅
18 篇文章 0 订阅

Masonry和SDAutoLayout不同:SDAutoLayout需要上下左右四个方向都显示性的进行约束,虽然当高度和宽度自适应时,可以少一个高度约束,但是也应有对应布局处理设置。因为标签是有顶部和底部空白间隙的,通常高度比字体大小大一些(当字体很大时的粗体差别很大),当设置的高度比标签实际高度小时,标签的顶部和底部被截取。当然它也有好处,就是严格按照布局高度实现ui.而Masonry并非上下左右四个方向都设置约束,一般2到3个不重复方向的约束就可以(没有就采用默认值推导)。就是设置上下左右的约束,它实际的标签也是按照标签的实际显示高度上下留空白,这样就造成和UI有稍微一点高度的偏差。可见他们各有优缺点,一般场景可以混用,带自适应高度的布局场景不能混用。
Masonry的自适应宽度和高度大致可以分为三类情况。
第一种情况:控件根据内容进行宽度自适应(就是省略左或右方向的一个约束):
[self.describeTitleLabel mas_makeConstraints:^(MASConstraintMaker make) {
make.left.mas_equalTo(COMMON_BIG_EDGE_DISTANCE);
// make.width.mas_equalTo(FULL_WIDTH-COMMON_EDGE_DISTANCE
2);
make.top.mas_equalTo(68+height+8);
make.height.mas_equalTo(16.0);
}];

当然若你的控件是先加载控件,后填入内容就需要在重置内容后对控件进行重新布局:
[self.describeTitleLabel mas_updateConstraints:^(MASConstraintMaker make) {
make.left.mas_equalTo(COMMON_BIG_EDGE_DISTANCE);
// make.width.mas_equalTo(FULL_WIDTH-COMMON_EDGE_DISTANCE
2);
make.top.mas_equalTo(68+height+8);
make.height.mas_equalTo(16.0);
}];
注意:Masonry是延迟布局生效,不是你刚调用mas_makeConstraints或mas_updateConstraints对控件进行布局后立即填充内容,它的宽度就是刚布局时的宽度。但是若控件已经加载出来,等大约1秒后你再对它赋值,那么你不对它重新布局,那么它显示的就是最开始的宽度。高度自适应也是如此。
第二种情况:非表格控件根据内容进行高度自适应(就是省略上或下方向的一个约束):
[content mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(COMMON_BIG_EDGE_DISTANCE);
make.right.mas_equalTo(-COMMON_BIG_EDGE_DISTANCE);
make.top.mas_equalTo(68.0);
}];

第三种情况:表格控件根据内容进行高度自适应,不但要对控件进行最大预计宽度设置(contentLab.preferredMaxLayoutWidth = SCREEN_WIDTH - BaseSize(43);),还要对表格高度进行自适应(不能有height约束),对表格高度设置为高度自适应的值(UITableViewAutomaticDimension)。
表格加载代码:

  • (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    return UITableViewAutomaticDimension;
    }
    表格控件布局函数部分代码:
    #import “MessageTableViewCell.h”

@implementation MessageTableViewCell

  • (void)awakeFromNib {
    [super awakeFromNib];
    // Initialization code
    }

  • (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
    }

  • (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
    [self initCell];
    self.selectionStyle = UITableViewCellSelectionStyleNone;

    }
    return self;
    }

  • (void)initCell{
    UILabel* contentLab = [UILabel labelWithText:@“ttttttttttttttttttttttt” font:SystemFontOfSize(14) textColor:TextBlackColor];
    contentLab.preferredMaxLayoutWidth = SCREEN_WIDTH - BaseSize(43);
    contentLab.numberOfLines = 0;
    contentLab.textAlignment = 0;
    [self.contentView addSubview:contentLab];
    self.contentLab = contentLab;

    [contentLab mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.mas_equalTo(BaseSize(12)).;
    make.left.mas_equalTo(BaseSize(17));
    make.right.mas_equalTo(BaseSize(-26));
    make.bottom.mas_equalTo(-BaseSize(23.5));

    }];
    }

  • (void)setMsg:(MessageModel *)msg {
    _msg = msg;
    self.contentLab.text = msg.Title;
    }

@end
其中最核心的代码是:

contentLab.preferredMaxLayoutWidth = SCREEN_WIDTH - BaseSize(43);
contentLab.preferredMaxLayoutWidth = SCREEN_WIDTH - BaseSize(43);
    [contentLab mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(BaseSize(12)).;
        make.left.mas_equalTo(BaseSize(17));
        make.right.mas_equalTo(BaseSize(-26));
        make.bottom.mas_equalTo(-BaseSize(23.5));
        
    }];

注意:若你是立即对表格赋值或赋值后局部更新,需要更新布局使用下面的代码:

- (void)setMsg:(MessageModel *)msg {
    _msg = msg;
    self.contentLab.text = msg.Title;
    [self.contentLab mas_updateConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(BaseSize(12)).;
        make.left.mas_equalTo(BaseSize(17));
        make.right.mas_equalTo(BaseSize(-26));
        make.bottom.mas_equalTo(-BaseSize(23.5));
    }];
}

另外在UILabel自适应高度的同时,也可以对UILabel显示的最大行数进行限制,代码如下:

[self.productNameLabel setMaxNumberOfLinesToShow:2];

实现自适应高度和宽度见《自适应高度的表格UICollectionView》《使用SDAutoLayout实现控件根据内容进行宽度自适应和高度自适应》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Swift的UITableView中根据文字内容自动撑开UITableViewCell的高度,可以按照以下步骤操作: 1. 首先,在UITableViewCell中添加一个UILabel,并设置好约束。 2. 在UITableView的代理方法中,实现heightForRowAt方法。该方法返回值为该行的高度。在该方法中,计算UILabel的高度,并返回该高度。代码如下: ```swift func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { let text = dataArray[indexPath.row] let width = UIScreen.main.bounds.size.width - 20 let font = UIFont.systemFont(ofSize: 17) let size = CGSize(width: width, height: CGFloat(MAXFLOAT)) let paragraph = NSMutableParagraphStyle() paragraph.lineBreakMode = .byWordWrapping let attributes = [NSAttributedString.Key.font: font, NSAttributedString.Key.paragraphStyle: paragraph] let rect = text.boundingRect(with: size, options: [.usesLineFragmentOrigin, .usesFontLeading], attributes: attributes, context: nil) return rect.height + 20 } ``` 其中,dataArray是存储文字内容的数组。 3. 在UITableViewCell中,设置UILabel的numberOfLines为0,并设置好约束。 4. 在UITableView的代理方法中,实现cellForRowAt方法。在该方法中,设置UILabel的text属性。代码如下: ```swift func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) let label = cell.viewWithTag(100) as! UILabel label.text = dataArray[indexPath.row] return cell } ``` 这样,就可以根据文字内容自动撑开UITableViewCell的高度了。其中,dataArray是存储文字内容的数组。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值