iOS 8 中自动调整 UITableViewCell 大小

2023-11-23

我有一个 UITableViewCell 子类,其中包含多行标签,我希望单元格根据该标签的内容动态调整自身大小。我知道 iOS 8 引入了基于自动布局约束的自动调整单元格大小,并且我已经在 SO 上找到了几个这样的示例,但我在正确实现此行为时仍然遇到一些问题。

这是我的 updateConstraints 实现:

- (void)updateConstraints {
    [super updateConstraints];

    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[_nameLabel(==20)]-10-[_tweetLabel]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_nameLabel, _tweetLabel)]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[_avatarView]-10-[_nameLabel]-10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_avatarView, _nameLabel)]];

    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_nameLabel]-10-[_tweetLabel]-10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_nameLabel, _tweetLabel)]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[_avatarView]-10-[_tweetLabel]-10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_avatarView, _tweetLabel)]];

    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[_avatarView(==45)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_avatarView)]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[_avatarView(==45)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_avatarView)]];
}

在表视图控制器中,我将行高设置为 UITableViewAutomaticDimension (并且我还设置了估计行高)。在运行时,我遇到一系列自动布局错误,并且所有表格视图单元格几乎完全重叠。

自动布局冲突存在于以下约束之间:

  • V:|-(10)-[_nameLabel]
  • V:[_nameLabel(20)]
  • V:[_nameLabel]-(10)-[_tweetLabel]
  • V:[_tweetLabel]-(10)-|
  • V:[cell(44)]

我怀疑最后一个约束“UIView-Encapsulated-Layout-Height”(强制高度为 44)是问题的原因,但我不太确定它来自哪里,所以希望有人可以解释一下问题。


为了实现表视图单元格的自动行高,您需要执行以下操作:

  1. 在单元格的 contentView 中实现自动布局约束,允许视图表达其首选高度。一定要设置UILabels 进行多行自动换行。

    确保您已在两个维度中定义了一系列约束的轴向链,即从视图的一个边缘到另一边缘共同绑定的约束。也许确保这些约束正确的最简单方法是将您的自定义内容实现为普通的旧内容UIView(这很容易测试),然后使用约束,以便UITableViewCell.contentView拥抱这种观点。 (我用这个要点自动构建“视图包装单元”。)

  2. Set tableView.rowHeight = UITableViewAutomaticDimension

  3. Set tableView.estimatedRowHeight = 400或其他一些相当慷慨的值,以便在估计值太低时解决一些 UIKit 错误。

我花了相当多的时间来研究这个功能。这个 github 仓库 shows 自调整大小表格视图单元格的七个完整示例包含一个包装文本的标签——程序化、基于笔尖、基于故事板等。

最后,如果您在第一次加载表视图时看到有关不可满足约束的警告,其中提到“UIView-Encapsulated-Layout-Height”或类似内容,请不要太担心。这是一个人工制品UITableView创建单元格的初始过程,确定其大小should基于自动布局约束,并保持UITableViewCell紧紧包裹着它的contentView。我上面提到的存储库有更广泛的讨论和代码,用于探索 API 的这个有点尴尬的角落。

您只需担心违反约束的警告,即使在单元格加载并滚动了一点之后它们仍然存在,或者您最初看到不正确的布局。在这种情况下,第一步应该始终是通过开发约束并在可能的情况下单独测试它们来确保您的约束是正确的,以简单的方式UIView.

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

iOS 8 中自动调整 UITableViewCell 大小 的相关文章

  • UITesting、XCTest 当前 ViewController 类

    简单的问题 我有一个按钮可以执行到下一个视图控制器的操作 我想写 UI XCTest 来告诉我它是否打开了我想要的视图控制器 UI 测试框架无法访问您的应用程序代码 这使得无法对实例进行类断言 你不能够directly告诉屏幕上的控制器的类
  • 如何在 iOS 中将 Firebase 对象持久保存到磁盘?

    看起来Firebase http www firebase comiOS 实现不支持客户端模型的离线缓存 这在实践中意味着 对于需要身份验证的 Firebase 应用程序 您需要首先进行身份验证并等待 Firebase 完成登录 检查用户身
  • 在回调函数中调用目标c函数

    如何在回调函数中调用目标c函数 回调函数 static OSStatus inputRenderCallback void inRefCon AudioUnitRenderActionFlags ioActionFlags const Au
  • 与 Objective-C 的 VPN 连接

    有没有办法在 iPhone 的 Objective C 中以编程方式建立 VPN 连接 有这方面的好教程吗 有人知道吗 多谢 我认为第三方应用程序无法访问这些 API
  • 使用 Interface Builder 创建的自定义视图在其他视图中调用时不会呈现

    我有一个用于主窗口的 xib 并通过以下步骤创建了一个自定义视图 创建一个新类 继承自NSView MyView h import
  • 如何组合两个 SwiftyJSON 对象

    我有一个 swiftyJSON 对象 例如 location http img http commentCount 0 timestamp 1432460217550 我希望能够向其附加另一个 swiftyJSON 对象 使其看起来像 lo
  • 为具有多个目标和不同平台的项目编写 Podfile

    我正在准备一个支持 OS X 和 iOS 的 Pod 我的 pod 有一些自己的依赖项 这些依赖项在 podspec 文件中定义 因此我使用 Podfile 来管理我用来开发 pod 和运行测试的项目的依赖项 我正在使用 CocoaPods
  • Objective C 中类别是如何实现的?

    作为一名程序员 我知道如何使用类别 但我很好奇它们是如何实现的 编译器是否将它们编译为对类替换方法 http developer apple com library mac documentation Cocoa Reference Obj
  • 在 UITableViewController 中重新排序行后 UI 更新不正确

    因此 我对表中的行重新排序 用户界面最终结果不正确 场景如下 表内容原文 a b c d e 如果我移动第 0 行 当前a 到第 4 行 当前e 我看到的最终结果是 c d e a a 一些背景 该表正在读取 Realm 对象的列表 我确认
  • NSURLCache 不缓存

    我正在使用 Xcode 6 1 6A1030 iOS7 和 iOS8 模拟器 NSURLCache 似乎没有缓存任何东西 我使用 Cache Control 标头 我的服务器返回带有 max age 6000 的 Cache Control
  • 如何检索 iPhone 的区域设置

    我用谷歌搜索过它 但令我有点惊讶的是我找不到它 我只想访问设备配置的区域设置 我试图找到如何列出所有系统属性 以防我能在那里找到区域设置 但甚至找不到如何做到这一点 我知道 认为 我之前检索过系统属性 但我也记得在谷歌搜索时找到该信息并不容
  • Swift:协议、结构、类

    我开始学习 Swift 语言 但在理解协议 结构和类方面遇到了困难 我来自 Android 方面的编程 所以我相信 Swift 协议基本上是 Java 接口 其中每一个的正确用例是什么 这些类比并不 完全 正确 但这就是我所理解的要点 是的
  • 命令 /Applications/Xcode-beta.app/Contents/Developer/usr/bin/atool 失败,退出代码 255

    它发生在新的 Xcode7 beta 中 CompileAssetCatalog Users admin Library Developer Xcode DerivedData InstaAd ddgdnbxlpxipirebpndfmgr
  • 在 Swift 中以编程方式为 iOS 制作带有名字首字母的图像,例如 Gmail

    我需要在 UITableView 中显示与其姓名相对应的每个用户的个人资料图片 在下载图像之前 我需要显示一张带有他名字的第一个字母的图像 就像在 GMail 应用程序中一样 如何在 Swift for iOS 中以编程方式执行此操作 不需
  • UILabel 中的文本未垂直居中

    我使用以下代码创建了一个标签 func setupValueLabel valueLabel numberOfLines 1 valueLabel font UIFont name Avenir Black size 50 valueLab
  • removeItemAtPath 完成

    我正在以这种方式删除路径上的文件 UIPanGestureRecognizer gesture UIPanGestureRecognizer sender UIButton button UIButton gesture view UIPa
  • XCode 7 中的 AWSS3TransferManagerUploadRequest

    我今天升级到 Xcode 7 Swift 2 0 我的项目正在使用 CocoaPods 我正在 POD 文件中导入所有与 AWS 相关的文件 我已经设置了桥接标头 并导入了 Amazon 告诉我的所有文件 在升级到 Swift 2 0 之前
  • cordova插件条码扫描仪打不开扫描

    我的条形码扫描仪插件有问题 我不是天才 我不太了解如何编写网络应用程序 我使用phonegap和cordova 并且尝试制作一个网络应用程序 在单击链接后扫描条形码 我之前已经使用此命令行安装了该插件 cordova plugin add
  • 带有文本字段的 iPhone AlertView

    我有一个UIAlertView with a UITextField在里面 我想输入mail id并提交于UIAlertView s ok按钮 但是UITextField in the UIAlertView没有回复 请帮助我 thankz
  • 从plist文件中读取数据

    我正在尝试为我的 iPhone 应用程序实现保存状态 我有一个名为 SaveData plist 的 plist 文件 我可以通过以下方式读取它 NSString pListPath2 bundle pathForResource Save

随机推荐

  • 卡夫卡主题_授权_失败

    我实际上正在努力使用 SASL 纯文本设置简单的 Kafka 身份验证并添加 ACL 授权 但当我尝试使用数据时遇到问题 main INFO org apache kafka common utils AppInfoParser Kafka
  • Pandas 使用 read_sql_table 使用过多内存

    我正在尝试将 Postgres 数据库中的表读入 Python 表大约有 800 万行和 17 列 数据库大小为 622MB 我可以使用 psql 将整个表导出到 csv 然后使用 pd read csv 读取它 它工作得很好 Python
  • Android,使用 javah 生成 jni 头文件,显示找不到 org.opencv.core.Mat 的错误

    当我用 jni 编译 java 类中的本机方法时 我只是遇到了一个恼人的问题javah生成 JNI 头文件 如果该类使用了第3方包 例如 org opencv core Mat 则javah会显示找不到 org opencv core Ma
  • 获取函数的元数

    在 Javascript 中 如何确定为函数定义的形式参数的数量 注意 这不是arguments调用函数时的参数 而是定义函数时使用的命名参数的数量 function zero Should return 0 function one x
  • 如何从Python中的url中删除scheme?

    我正在使用一个返回 url 的应用程序 用Flask 我想要URL显示给用户尽可能干净 所以我想删除http 从中 我看了看 发现了urlparse库 但找不到任何如何执行此操作的示例 最好的方法是什么 如果urlparse是不是太过分了
  • Interface Builder 中带有自动 NSNumberFormatter 的 NSTextField

    我制作 iOS 应用程序已经有一段时间了 但我正在尝试 MacOS 开发 我正在向我的 UI 添加一个 NSTextField 我注意到在 Xcode 中图形小部件中的选项之一是 NSTextField with NSNumberForma
  • Javascript DOM 树复制用于操作

    由于页面的 DOM 树是活动的并且始终反映在浏览器中 因此出于某种目的修改此 DOM 树而不影响实际渲染的树的最佳方法是什么 假设我的目的是交换某些子节点并查看 DOM 树仍然保持多么相似 创建重复树是唯一的解决方案吗 如果是的话 有没有一
  • 您必须在安全防火墙配置中使用 form_login 配置要由防火墙处理的检查路径

    我有网络服务 它是我的 常规 用户的提供者 我想为我的管理员使用 FosUserBundle 以上是我的安全配置 普通用户登录没有问题 但是当我想以管理员身份登录时 我收到以下消息 您必须在安全防火墙配置中使用 form login 配置要
  • Django 测试表没有被创建

    我正在尝试为我的 django 项目编写测试用例 但是当我运行时 manage py 测试 命令 它正在创建测试数据库 但没有创建任何表 并且我收到一个错误 表明表不存在 欢迎任何建议 这是我通过 manage pyspectdb gt m
  • PySpark 数据帧 to_json() 函数

    我有一个如下所示的数据框 gt gt gt df show 10 False id name age salary 10001 alex 30 75000 10002 bob 31 80000 10003 deb 31 80000 1000
  • 使用 twitter4j 停止 Twitter 流并返回状态列表

    使用 Twitter4j 提供的代码示例 我希望在收集 1 000 个状态列表后停止流 并返回此列表 我怎样才能做到这一点 public class Stream public List
  • 如何在 Windows 之间切换 python 版本

    我正在尝试在 python 版本之间切换3 6 6 and 3 7 0在窗户中 我试过py 3 6 6并且不起作用 寻找选项py h 没有找到 我看到了一些关于在 python 版本之间切换的答案2 x and 3 x通过增加 python
  • 复选框值 0 或 1

    在很多情况下 我有如下复选框
  • 类型“System.Web.IHtmlString”在未引用的程序集中定义

    现在有点失落 我正在按照以下文章来测试 学习嵌套布局 http blogs msdn com b marcinon archive 2010 12 15 razor nested layouts and redefine sections
  • 如何从 XSD 架构构建数据库并导入 XML 数据

    我有一个复杂的 XSD 架构和数百个符合该架构的 XML 文件 如何自动创建相关的 SQL Server 表来存储 XML 数据 我考虑过使用 XSD 模式创建 C 类xsd exe工具 并让 Subsonic 之类的东西弄清楚如何从中创建
  • Visual Studio 2012 中的经典 ASP 调试禁用应用程序调试

    我想调试Classic ASP网站位于Visual Studio 2012 with IIS Express 因此 我附上了iisexpress exe in VS 2012 但它显示Application Debugging is dis
  • 检测并删除文本区域中的 URL

  • Kendo UI Grid 序列号列

    我试图将 Kendo 网格的第一列作为串行索引 它不受行记录排序的影响 我有什么办法可以实现这个目标吗 谢谢 您可以使用模板列来实现此目的 这是一个现场演示 展示了如何做到这一点 http jsbin com olutin 10 edit
  • 为什么 Python 返回负时区值?

    For 时间 时区 Python 文档说 本地 非 DST 时区的偏移量 以 UTC 以西的秒数为单位 西欧大部分地区为负值 美国为正值 英国为零 有谁知道为什么它对西欧大部分地区返回负值 这些国家处于正抵消状态 而不是负抵消状态 示例 布
  • iOS 8 中自动调整 UITableViewCell 大小

    我有一个 UITableViewCell 子类 其中包含多行标签 我希望单元格根据该标签的内容动态调整自身大小 我知道 iOS 8 引入了基于自动布局约束的自动调整单元格大小 并且我已经在 SO 上找到了几个这样的示例 但我在正确实现此行为