[iOS] TableViewCell 自适应高度

2023-05-16

说明

TableViewCell 几乎是必用控件,使用 TableViewCell 免不了计算其 cell 高度,网上也有非常多关于 TableViewCell 高度自适应的文章,自己也尝试总结了计算cell高度的几种方法。

TableViewCell 的行高计算

固定行高时

Cell高度固定图

如图所示:Cell 的格式是固定的,有一个固定高度,这种情况可以通过行高属性 rowheight 及行高方法 heightForHeaderInSection 来设置

//设置行高的属性
self.tableview.rowheight = 100;

//设置行高的方法
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 100;
}

行高不固定时

Cell高度变化图

如图所示:UILabel 的文字长度是不固定的,有的 Cell 含有配图,有的 Cell 不含配图,所以 Cell 的高度不能写死。需要根据数据的情况,让 Cell 自适应高度。

Cell 自适应高度的方法

方法一:通过 sizeThatFits 或 boundingWithRect 计算UILabel高度 从而计算 Cell行高

对于 UIImageView 的处理:

使用masonry对图片添加约束,当设置数据源的时候:
- 若有图片则使用SDWebImage 设置图片。
- 若无图片,则不设置图片,使用 mas_updateConstraints 更新约束将图片高度设置为0.

对于 UILabel 的处理:

计算UILabel高度即可:至于计算UILabel高度的计算方式,不管是普通文字的 text, 还是富文字的 attributedText 都可以通 sizeThatFits 或 boundingWithRect,计算出 UILabel的高度,详细计算方法参考另一篇文章UILabel 设置内容的间距及高度的计算。

行高的计算

由以上两步,分别计算出 UIImageView 的高度 imaeViewHeight、UILabel 的高度labelHeigh。此时 Cell 的行高就可以通过 imageViewHeight + labelHeight 计算出行高 cellHeight, 此时将cellHeight通过模型来保存: model.cellHeigh = imageViewHeight + labelHeight ,方便以后调用 。

最后通过 heightForRowAtIndexPath 来设置该行行高

//设置行高
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return model.cellHeight;
}

方法二: 通过 autoLayout 设置估计高度,来自适应高度

此方法适用于 iOS8 之后版本

对于 UIImageView 的处理:

使用 masonry 对图片添加约束,当设置数据源的时候:
- 若有图片则使用SDWebImage 设置图片。
- 若无图片,则不设置图片,使用 mas_updateConstraints 更新约束将图片高度设置为0.

对于 UILabel 的处理

只需要在设置数据源之后,调用 [contentLabel sizeToFit];

行高设置方法

  • 使用属性: self.tableView.estimatedRowHeight = 100; //设置估计高度
  • 设置高度: self.tableView.rowHeight = UITableViewAutomaticDimension; //
    设置 rowHeight 默认值

这样 Cell 就可以自适应高度了。
此时,会自适应高度,所以 heightForRowAtIndexPath 方法设置高度就没有效果。
- (CGFloat)tableView:(UITableView )tableView heightForRowAtIndexPath:(NSIndexPath )indexPath { } 失效。

方法三: 使用第三方框架 UITableView+FDTemplateLayoutCell

使用UITableView+FDTemplateLayoutCell,就算比较复杂的界面,只需要调用 fd_heightForCellWithIdentifier 即可轻松解决。
此框架使用方法非常简单,
1. 首先检查:Cell 中 Y 方向约束设置完整。
3. 然后检查:是否注册 cell, registerClass。
4. 导入头文件:UITableView+FDTemplateLayoutCell.h。
5. 在-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{ }方法中调用 API。

API 设置方法如下:

#import <UITableView+FDTemplateLayoutCell.h>
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return [tableView fd_heightForCellWithIdentifier:@"identifer" cacheByIndexPath:indexPath configuration:^(id cell) {
        // 配置 cell 的数据源,和 "cellForRow" 干的事一致,比如:        
        [cell configureCellWithData:self.model[indexPath.row]];
    }];
}

在设置数据时,若图片为空,则不需要设置图片,及清零图片高度:

- (void)configureCellWithData:(JHmodel *)model {
//设置数据
  _contentLabel.text = [NSString stringWithFormat: @"%@:%@\n\n%@:%@",
                        self.title,
                        model.newsTitle,
                        self.news,
                        model.newcontent,
                        ];
//当图片不为空时,设置图片,更新约束
    if (model.urlImage != nil) {
    [self.urlImageView sd_setImageWithURL:[NSURL URLWithString:model.urlImage]];
    [self.urlImageView mas_updateConstraints:^(MASConstraintMaker *make) {
      make.height.mas_equalTo(180);
      make.bottom.mas_equalTo(self.contentView).offset(-15);
    }];
  } else {
//当图片为空时,不设置图片,更新约束
    [self.urlImageView mas_updateConstraints:^(MASConstraintMaker *make) {
      make.height.mas_equalTo(0);
      make.bottom.mas_equalTo(self.contentView).offset(0);
    }];
  }
}

ViewDemo

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

[iOS] TableViewCell 自适应高度 的相关文章

  • 以编程方式检测应用程序是否正在设备或模拟器上运行

    我想知道我的应用程序在运行时是在设备还是模拟器上运行 有没有办法检测到这一点 原因是用模拟器测试蓝牙 api http volcore limbicsoft com 2009 09 iphone os 31 gamekit pt 1 woo
  • 无法识别的选择器调用静态 iOS 库中的类别方法

    我正在使用一些第三方软件来帮助使用 Xcode 4 3 2 编写 iPad 应用程序 该软件是开源的 通常经过设置 因此其代码将与开发人员为应用程序编写的任何代码一起编译 因为我在很多地方使用该软件 所以我决定将其构建为 iOS 模拟器的静
  • Swift - 将图像插入 PDF 不再适用于 iOS 13

    目前正在开发在我的贷款计算器应用程序上导出 PDF 的功能 我有一个预览屏幕 可以在您保存 PDF 之前显示它 预览屏幕由带有 html 的 webView 组成 其中包含占位符 我能够成功地将图像插入到正确的占位符上 并将其显示在 PDF
  • IOS 上图像的加密/解密

    我们正在使用加密 解密和 UIIMAGE 如果我们加密和解密 UIIMAge 而不保存到 iphone 画廊中 它工作正常 但如果我们加密 保存到画廊中 将 加密的图像 加载到应用程序中 然后解密它效果不好 我们使用这个函数来加密 解密 保
  • iOS 键盘显示后分屏宽度

    我刚刚开始研究 Cordova 应用程序对分屏多任务处理的支持 到目前为止 该应用程序在模拟器中的 iPad 上显示和调整大小都很好 但是当我单击编辑字段并显示软件键盘时 100 宽度的值开始返回整个屏幕 而不是给出的窗口 初始显示 到目前
  • ArraySlice 中的 Swift [重复]

    这个问题在这里已经有答案了 在数组上使用 prefix 方法后 我得到了所谓的 arraySlice 我怎样才能将其转换为数组 我试图从 FacebookGraphApi 获取 Ints 然后请求前 3 个 前缀 3 并尝试将它们添加到新数
  • 如何在运行仅 iPhone 应用程序(非通用)的 iPad 上的 UIPickerView 中支持 VoiceOver?

    一般来说 我会查看 Apple 的 UICatalog 示例代码以获取基本的 VoiceOver 支持 但示例代码中似乎有对 UIPickerViews 的 VoiceOver 支持 我是否需要在某处提供accessibilityLabel
  • 如何在 NSDate 变量中仅设置时间?

    我有 NSDate 变量 只想更改时间 不应更改日期 是否可以 例如 用户在 DatePicker 日期中选择日期间隔 如果是开始日期 我想将时间设置为 00 00 00 如果是结束日期 我将时间设置为 23 59 59 感谢你的帮助 问候
  • 检查系统时间是自动还是用户设置

    我需要在当前的项目中设置用户证明时间 我围绕这个问题发现了很多不同的问题 但似乎没有一个问题有我正在寻找的答案 这些是我到目前为止看过的问题 XCODE 如何从设备获取 验证准确的时间戳 https stackoverflow com qu
  • 在 UITextView 上添加具有自定义间距和文本的图像

    I want to add Image on text view and want proper spacing as shown in screenshot 我尝试在文本视图上添加图像 但在根据要求放置文本时遇到问题 请向我提供有关同样的
  • AppDelegate 的变量用作全局变量不起作用

    我想使用我的 AppDelegate 来存储任何其他类都可以访问的对象 我已经像这样声明了这个 AppDelegate interface MyAppDelegate UIResponder
  • 如何更改便携式 xamarin ios 项目中的启动屏幕?

    我正在使用便携式 xamarin 形式 其中项目是 IOS 项目 在 IOS 项目中 我想创建闪屏 我在 ios 项目属性中添加了 Iphone 启动图像和 iPad 启动图像 当我运行该应用程序时 它显示默认的启动屏幕 我还尝试从 inf
  • CMSampleBufferSetDataBufferFromAudioBufferList 返回错误 12731

    我正在尝试捕获应用程序声音并将其传递给 AVAssetWriter 作为输入 我正在设置音频单元的回调以获取 AudioBufferList 问题始于将 AudioBufferList 转换为 CMSampleBufferRef 它总是返回
  • iOS 11 浮动 TableView 标题

    有一个应用程序包含多个部分 展开 时每个部分有几行 折叠 时没有 每个部分都有一个部分标题 使用以下子类重用它们UITableViewHeaderFooterView等等 到目前为止一切顺利 然后在 iOS 11 中 我使用了可视化调试器
  • AFNetworking 上传图片

    我看过一些例子 但我认为我的问题可能出在 PHP 中 我正在尝试使用 AFNetworking 将图像从 iPhone 上传到服务器 这是我的 obj c 代码 IBAction uploadButtonClicked id sender
  • 使用prepareForSegue传递数据

    我试图将数据从viewController 1传递到viewController2 我有2个按钮和1个segue 因此有一个segue标识符 这2个按钮 按下时每个按钮应显示 1个标签用于显示标题 1个textView用于显示定义 我很难显
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • UITextView:内存使用量巨大

    我在 UITextView 中遇到了内存使用过多的问题 我正在将 50Kb ascii 文本文件加载到 NSString 中 并将其分配给应用程序中空 UITextView 组件的 text 属性 这立即使我的内存占用量增加了 100Mb
  • 由于 2.23 导致 iOS 应用程序被拒绝 - iOS 数据存储指南

    以下是 Apple 关于拒绝的消息 2 23 应用程序必须遵循 iOS 数据存储指南 否则将被拒绝 2 23 详情 在启动和内容下载时 您的应用程序会存储 6 5 MB 这并不意味着 遵守 iOS 数据存储指南 下一步 请验证只有用户使用您
  • 选择 UITableViewCell 时 UIView 背景颜色消失

    我在界面生成器中构建了一个简单的 tableViewCell 它包含一个包含图像的 UIView 现在 当我选择单元格时 会显示默认的蓝色选择背景 但 UIView 的背景颜色消失了 我的 UITableViewCell 的实现文件没有做任

随机推荐

  • [路由][教程]OpenWrt通过LAN连接上级路由做交换机+无线功能教程

    1 前言 上级路由为ikuai软路由 xff0c 数据处理交给软路由来做 xff0c OpenWrt运行在路由器上 xff0c 通过LAN连接上级路由从而只做WIFI接收发送功能 此教程只能将LAN作为交换机使用 xff0c WAN口不行
  • [路由][教程]OpenWrt设置为交换机+无线功能教程

    1 前言 上级路由为ikuai软路由 xff0c 数据处理交给软路由来做 xff0c OpenWrt运行在路由器上 xff0c 通过LAN连接上级路由从而只做WIFI接收发送功能 2 需求 路由的LAN和WAN全部作为交换机使用无线WIFI
  • CV学习笔记-特征提取

    特征提取 1 概述 图像中常见的特征有边缘 角 区域等 通过各属性间的关系 xff0c 改变原有的特征空间 xff0c 例如组合不同的属性得到新的属性 xff0c 这样的处理叫做特征提取 注意特征选择是从原始的特征数据集中选择出子集 xff
  • CV学习笔记-深度学习

    深度学习 1 神经网络 1 概述 引例 xff1a 生物神经网络作用机理 生物神经网络的基本工作原理 xff1a 一个神经元的输入端有多个树突 xff0c 主要是用来接收输入信息的 输入信息经过突触处理 xff0c 将输入的信 息累加 xf
  • Mybatis-Plus条件构造器笔记

    Mybatis Plus条件构造器笔记 Mybatis Plus官方文档 xff1a https baomidou com pages 10c804 本文主要讨论Mybatis Plus条件构造器的区别和用法 QueryWrapper Up
  • 日常刷题 (0)

    牛客刷题 1 即使不进行强制类型转换 xff0c 在进行指针赋值运算时 xff0c 指针变量的基类型也可以不同 xff1f 答 xff1a 错 xff0c 指针变量的赋值只能赋予地址 xff0c 决不能赋予任何其它数据 xff0c 否则将引
  • coursera C程序进阶 第二周 #6

    题目 xff1a 流感传染 有一批易感人群住在网格状的宿舍区内 xff0c 宿舍区为n n的矩阵 xff0c 每个格点为一个房间 xff0c 房间里可能住人 xff0c 也可能空着 在第一天 xff0c 有些房间里的人得了流感 xff0c
  • 大数据学习路线图(旧)

    一 入门准备 1 linux操作基础 1 Linux的介绍 xff0c Linux的安装 xff1a VMware Workstation虚拟软件安装过程 CentOS虚拟机安装过程 2 Linux的常用命令 xff1a 常用命令的介绍 常
  • Linux网络编程:状态机

    Linux网络编程 xff1a 状态机 状态机基本概念介绍状态机的特征状态机的要素注意 xff01 为什么在网络编程中需要状态机 xff1f 状态机基本概念介绍 首先我们简单的介绍一下状态机的基本概念 有限状态机是一种用来进行对象行为建模的
  • Ubuntu 20.04 安装 cuda9.0不成功如何解决

    cuda9 0需要低版本gcc才能兼容 xff0c 试了很多教程 xff0c 最终参考以下链接安装成功 xff0c 粗略记录一下 xff0c 免得下次又采坑 1 安装低版本gcc xff1a gcc 5 4 0 参考以下链接 xff1a 不
  • (八)linux中断实现

    目录 一 linux中断的实现二 中断号三 中断的标志四 中断源对应的中断服务程序五 中断服务程序与原子上下文六 等待队列七 附录 一 linux中断的实现 span class token macro property span clas
  • i3wm 屏幕配置踩坑

    i3wm 屏幕配置踩坑 前言踩坑 前言 自从18 19年开始正式使用linux作为我的开发系统就一直没有换回windows 从一开始的 ubuntu 到后来的manjaro 感觉越来越有意思可玩性很高 至于我我什么不换回windows 原因
  • 这个Python库太强了,竟然能把图片,视频无损清晰放大!

    这几天在逛GitHub的时候发现了一个非常牛逼的库 xff0c 竟然有逆天的功能 xff0c 一个用Python做的库 xff0c 利用机器学习算法把图片无损的放大很多倍 这个库叫video2x xff0c 目前收获1500颗星 xff0c
  • 字符串和枚举的互相转化

    字符串和枚举的互相转化 字符串转枚举枚举转字符串总结 字符串转枚举 提示 xff1a 关键代码Enum Parse 代码如下 xff08 示例 xff09 xff1a string str span class token operator
  • CentOS7 安装mysql(YUM源方式)

    CentOS7 安装mysql xff08 YUM源方式 xff09 1 下载mysql源安装包 wget http dev mysql com get mysql57 community release el7 8 noarch rpm
  • Linux(5)---Linux中nano命令

    nano是一个字符终端的文本编辑器 xff0c 有点像DOS下的editor程序 它比vi vim要简单得多 xff0c 比较适合Linux初学者使用 某些Linux发行版的默认编辑器就是nano nano命令可以打开指定文件进行编辑 xf
  • Centos7安装配置桌面环境xfce

    1 centos最小化安装之后由于没有桌面环境 xff0c gnome太大 xff0c 所以找一个小的桌面环境用于一些不方便命令行的操作 2 首先是连接到网络 xff08 不详细展开了 xff09 3 安装桌面环境 yum groupins
  • 利用RSA+AES 前后端对数据进行加密处理 -- 整体思路

    利用RSA 43 AES 前后端对数据进行加密处理 整体思路 前言RSA加密算法RSA简介RSA缺点 AES加密算法AES简介AES缺点 RSA 43 AES 整体流程 前言 目前项目中需要对接口中的一些参数进行加密处理 xff0c 考虑了
  • centos7安装FreeSwitch,以及设置Freeswitch开机自启

    一 下载指定版本的freeswitch cd usr local src git clone branch v1 10 7 https github com signalwire freeswitch git 也可以下载1 10 7的压缩包
  • [iOS] TableViewCell 自适应高度

    说明 TableViewCell 几乎是必用控件 xff0c 使用 TableViewCell 免不了计算其 cell 高度 xff0c 网上也有非常多关于 TableViewCell 高度自适应的文章 xff0c 自己也尝试总结了计算ce