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

2023-05-16

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实现控件根据内容进行宽度自适应和高度自适应》。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Sqlserver中解析JSON

    参考 xff1a https www red gate com simple talk sql t sql programming consuming json strings in sql server 主要的过程代码单独贴出来 xff1
  • 解决逃离塔科夫0.12.9离线版修改商人可回收所有物品的问题

    复制这里的代码替换 xff0c 不会出现问题 span class token string property property 34 sell category 34 span span class token operator span
  • 手把手教你一套完善且高效的k8s离线部署方案

    作者 xff1a 郝建伟 背景 面对更多项目现场交付 xff0c 偶而会遇到客户环境不具备公网条件 xff0c 完全内网部署 xff0c 这就需要有一套完善且高效的离线部署方案 系统资源 编号主机名称IP资源类型CPU内存磁盘01k8s m
  • 好日子1/6啦啦啦

    今天我直接开搞把作业搞定 xff0c 上题目 题目背景 小明在 A 公司工作 xff0c 小红在 B 公司工作 题目描述 这两个公司的员工有一个特点 xff1a 一个公司的员工都是同性 A 公司有 NN 名员工 xff0c 其中有 PP 对
  • 树莓派4B安装PHP7.3 Nginx MySQL 教程

    非原创 感谢作者 https web security cn rapberry pi 4b install php7 3 nginx mysql 在树莓派4B上搭建Web服务器环境 xff1a PHP7 3 43 Nginx 43 Mari
  • 只需几步,U盘就能变“光驱”

    从07年开始 xff0c 移动存储市场就开始猛刮降价风 到现在 xff0c 大容量U盘的价格更是降到了难以想象的地步 xff0c 连8GB产品的价格都到了300元以内 不过虽然容量上去了 xff0c 一般U盘的功能却并没有太多的改变和延伸
  • 由<meta charset=“UTF-8“>引发的血案--常见字符编码解析

    lt meta charset 61 34 UTF 8 34 gt 是什么意思 xff1f 最近要找实习 xff0c 时间有限 xff0c 以后一定把底层原理写个明白 首先解释一下这句代码的意义 xff1a lt meta charset
  • 从HTTP响应头看各家CDN缓存技术

    https segmentfault com a 1190000006673084 从HTTP响应头看各家CDN缓存技术 由于国内各家电信运营商互联互通的壁垒 xff0c CDN作为互联网用户加速的最后一公里 xff0c 扮演了很重要的角色
  • Java NIO Selector详解(含多人聊天室实例)

    一 Java NIO 的核心组件 Java NIO的核心组件包括 xff1a Channel 通道 xff0c Buffer 缓冲区 xff0c Selector 选择器 xff0c 其中Channel和Buffer比较好理解 简单来说 N
  • axios.create()

    lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt meta name 61 34 viewport
  • 【无标题】

    Win11更新后无法使用网络 xff0c 可能是适配器驱动有问题的解决办法 把Win11系统更新后突然无法上网 xff0c 无论是wlan连接还是手机热点都用不了 尝试了网络上找到的多种办法 xff1a 1 使用网络疑难自动解决 xff0c
  • Linux /etc/profile 添加环境变量

    S1 从命令行 sudo vi etc profile S2 按 i 开始编辑 在文件适当位置添加环境变量 xff0c 比如 xff1a export PATH 61 PATH usr local cuda 10 1 bin LD LIBR
  • Kubernetes部署(八):k8s项目交付----(5)持续部署

    一 云计算模型概念 You manage 你管理 Managed by vendor 供应商管理 Applications 开发研发出的业务 Runtimes 运行时环境 xff0c Applications业务运行起来 xff0c 需要依
  • Redis的bind的误区

    Redis的bind的误区 cw hello1的博客 CSDN博客 今天在搭建Redis服务集群的时候 xff0c 发现自己一直以来对Redis中bind 的理解的一个误区 在今天以前 xff0c 我一直认为Redis中的配置文件中的bin
  • 使用find命令在当前目录不包含子目录中查找文件

    Linux中使用find命令在当面目录以及子目录中查找文件 xff0c 这个只需要加一个参数 depth即可 xff0c 然而想要在当前目录不包含子目录就没有一个简单的参数可以实现 xff0c 尤其所要查找的是某一个文件的时候 xff0c
  • NOI2.3.6262 流感传染题解(C++)

    题目 总Time Limit 1000ms Memory Limit 65536kB Description 有一批易感人群住在网格状的宿舍区内 xff0c 宿舍区为n n的矩阵 xff0c 每个格点为一个房间 xff0c 房间里可能住人
  • Ubuntu安装远程桌面软件xrdp

    Ubuntu安装远程桌面软件xrdp linux桌面版在服务器运行 xff0c 通常使用SSH命令访问的方式是比较单一的 xff0c 虽然配置 XShell 43 XManager可以实现打开图形程序 xff0c 但速度较慢 安装xrdp
  • IDEA 使用 SpotBugs 找出你代码中的bug

    SpotBugs 是 Findbugs 的继任者 xff0c 通过静态分析来查找 Java 代码中的 bug 下面我们主要是介绍 SpotBugs 在 idea 中的安装和使用 安装 Idea Preferences Plugins xff
  • Python 面向对象编程入门:从定义类到使用继承和多态

    目录 类的定义 继承 多态 在 Python 中 xff0c 面向对象编程是一种非常重要的编程范式 它允许我们通过创建对象来表示现实世界中的事物 xff0c 并将其组织为类的层次结构 xff0c 使代码更加模块化和易于维护 类的定义 在 P
  • Rust 语言通用代码生成器:莲花,发布冒烟测试版 3, 开始支持 PostgreSQL 数据库,更多功能,更多示例

    Rust 语言通用代码生成器 xff1a 莲花 xff0c 发布冒烟测试版 3 开始支持 PostgreSQL 数据库 xff0c 更多功能 xff0c 更多示例 Rust 语言通用代码生成器 xff1a 莲花 xff0c 已发布冒烟测试版

随机推荐