当单元格尚未构建时,如何计算 heightForRowAtIndexPath?

2023-11-29

问题 - 如何最好地计算 UITableViewController 的“heightForRowAtIndexPath”方法中一行的高度,假设:

  1. 我正在使用自定义子类 UITableViewCell ,子视图的实际大小(例如 UILabels)是在运行时计算的,并且取决于用户是否更改字体大小等因素
  2. 在“heightForRowAtIndexPath”之前,单元格实际上并未准备好,因此您不能依赖调用特定的自定义单元格实例来查询它

目前我唯一能想到的就是: 1. 在您的自定义 UITableViewCell 子类中创建一个方法来计算 UITableViewCell 子类中每个子视图(例如 UILabel)的高度 - 然后在创建实例时在单元格子类中使用它 2. 另外,在自定义子类中创建一个贯穿所有 UILabels 的类方法,调用上述方法来总结高度,从而计算出总行高。它必须获取传递给它的数据(例如每个 UILabels 中的文本) 3. 在 UITableViewController“heightForRowAtIndexPath”中,您必须调用上面 (2) 中的“calRowHeight”类型方法,并向其传递标签文本数据。因此,有效地调用自定义单元格子类上的类方法,该方法知道如何计算总行高,但它也使用单元格所需的相同逻辑......

还有比我缺少的更简单的方法吗?


创建 UITableView 时,每当您向其发送 reloadData 消息时,都会向数据源发送每个单元格的 heightForRowAtIndexPath 消息。因此,如果您的表格有 30 个单元格,则该消息将发送 30 次。

假设这 30 个单元格中只有 6 个在屏幕上可见。在这种情况下,当创建时并向其发送 reloadData 消息时,UITableView 将为每个可见行发送一个 cellForRowAtIndexPath 消息,即该消息被发送六次。

苹果为什么要这样实现呢?部分原因是计算行的高度几乎总是比构建和填充整个单元格更便宜。鉴于在许多表格中每个单元格的高度都是相同的,因此它通常要便宜得多。部分原因是 iOS 需要知道整个表格的大小:这允许它创建滚动条并将其设置在滚动视图等上。

如果行高大小因包含不同数量的文本而变化,则可以对相关字符串使用 sizeWithFont: 方法之一来进行计算。这比构建视图然后测量结果更快。请注意,如果更改单元格的高度,则需要重新加载整个表格(使用 reloadData - 这将询问委托的每个高度,但仅询问可见单元格)或有选择地重新加载大小已改变的行改变了。

附加材料如果我理解评论中的后续问题,以下内容可能会有所帮助:

如果您正在实现编辑模式,那么需要更改表格行的高度并不罕见。例如,您的表格行中可能有文本,当它们的单元格变窄时(为了为右侧的删除圆圈腾出空间),您可能希望某些单元格变高以容纳文本。这里的基本方法是:

  • 确保 tableView:heightForRowAtIndexPath: 方法知道您是否处于编辑模式。 (它可以使用 isEditing 询问 tableView。)然后获取返回正确高度的方法,具体取决于您是否处于编辑模式。

  • 在 UITableViewController 中的 setEditing:animated: 方法中(或 UIViewController,无论您使用哪个 - 根据您使用的不同,存在一些差异,因此值得仔细检查文档)在更改其状态后向 tableView 发送 reloadData 消息。这将强制 tableView 获取每一行的高度,并将重新获取可见行的单元格。当您进入编辑模式时,tableView 会处理使单元格变窄,但如果您想在布局上做更多工作,请在 tableView:cellForRowAtIndex: 中进行。如上所述,总体策略是找到一种快速计算高度的方法。使用文本 sizeWithFont: (及其变体)可以做到这一点。如果您有图像等,那么您可以获取它们的尺寸并进行一些求和。

  • 除了这些步骤之外,您可能还想在切换模式后稍微滚动 tableView。如果行的高度不同,那么切换模式后您将在表格中处于错误的位置。我在这里采取的方法是在重新加载表后使用 PerformSelector:withObject:afterDelay 来调用执行滚动调整的方法。您需要使用延迟,以便 tableView 有时间收集新的高度和新的表格单元格。 (可能有一种更聪明的方法。)我根据重新加载之前和之后屏幕上单元格第一个可见行的 tableView:cellForRowAtIndexPath: 的 origin.y 之间的差异进行一些求和,以进行滚动调整。因此,例如,要获取预加载之前的位置,有点像这样。

    CGPoint offset = [[self tableView] contentOffset];
    NSIndexPath* indexPath = [[self tableView] indexPathForRowAtPoint:CGPointMake(0,offset.y)];
    CGFloat preCellOffset = [[[self tableView] cellForRowAtIndexPath:indexPath] origin].y;
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当单元格尚未构建时,如何计算 heightForRowAtIndexPath? 的相关文章

  • 在 Objective-C 中比较 2 个字符串

    我写了以下代码 if depSelectedIndice gt 1 comSelectedIndice gt 1 NSLog depart elemet d depSelectedIndice NSLog depart elemet d c
  • 如何知道用户何时更改设置包

    我让用户在 iPhone 的设置区域中更改他们的设置 在下一次网络同步期间 我想将用户更改发送到服务器 但前提是做出改变 但是我如何知道用户何时在设置区域中进行了更改 如果可以的话 我想避免选择总是发送信息 无论是否更改 或者首先从服务器获
  • Swift Generics 在使用继承时不会实例化泛型

    我有课Alpha and Berry class Alpha class Berry Alpha 我有一个使用继承及其泛型的函数 func myFunc
  • 打乱 NSMutableArray 而不重复并显示在 UIButton 中

    在我看来 我有 12 个按钮 一个数组包含 6 个名称 我想在其中打印数组名称UIButton标题 这是我的代码 texts NSMutableArray alloc initWithObjects 1 2 3 4 5 6 nil UIBu
  • iPhone 应用程序中的异步、同步、线程

    我正处于一个应用程序的设计阶段 该应用程序将利用 REST Web 服务 并且在使用异步 同步和线程方面遇到了困境 这是场景 假设您有三个选项可供深入研究 每个选项都有自己的基于 REST 的资源 我可以使用同步请求延迟加载每个请求 但这会
  • 如何替换已弃用的方法dispatch_get_current_queue()? [复制]

    这个问题在这里已经有答案了 我正在 iOS 5 中使用 xmppframework 开发一个聊天应用程序 它工作得很好 但我将 Xcode 更新到 4 5 1 将 iOS 5 更新到 iOS 6 将 Mac OS 更新到 10 7 5 但由
  • 网站在 iPhone 屏幕右侧显示空白区域

    我遇到问题http eiglaw com http eiglaw com iPhone 屏幕右侧显示约 25 像素宽的空白 边框 我在 stackoverflow 上研究了这个问题 这些帖子是相关的 但是当我尝试提供的各种解决方案时 我无法
  • 导入 RNCryptor 后架构 armv7 的未定义符号

    我导入了 RNCryptor 可以在这里找到 https github com rnapier RNCryptor https github com rnapier RNCryptor进入我的应用程序 但是 我在日志中收到了三个错误 Und
  • 是否可以使用 Firebase 安排推送通知? [复制]

    这个问题在这里已经有答案了 我已经阅读了我能找到的所有文档 但仍然不知道这是否可行 如果我是用户 我可以安排特定时间的推送通知吗 Example 1 我是用户并打开应用程序 2 我允许通知并转到 pickerView 或其他任何内容 并设置
  • 更改组织以使用 Xcode 9 在 iTunes Connect 上上传二进制文件

    我在 Xcode9 上配置了多个团队 当我尝试将二进制文件上传到 Xcode 9 上的 iTunes Connect 时 没有更改团队的选项 并且出现以下错误 ERROR ITMS 4088 来自苹果开发者论坛的解决方案 1 正常存档2 窗
  • 如何接收有关与我共享的记录中所做更改的 CloudKit 通知?

    我有两个 iCloud 帐户 A and B 在两个不同的设备上 来自其中之一 A 我将 ckrecord 分享给另一个人 B 像这样 let controller UICloudSharingController controller p
  • 减少 CoreData 的调试输出?

    我正在开发一个使用 CoreData 的 iOS macOS 项目 它工作正常 但它会向控制台输出大量调试信息 这使得控制台无法使用 因为我的打印语句隐藏在所有与 CoreData 相关的内容中 我有一个非常简单的 CoreData 设置
  • 在 iOS 中,如何创建一个始终位于所有其他视图控制器之上的按钮?

    无论是否呈现模态或用户执行任何类型的转场 有没有办法让按钮在整个应用程序中 始终位于顶部 而不是屏幕顶部 有什么方法可以让这个按钮可拖动并可捕捉到屏幕上吗 我正在以苹果自己的辅助触摸作为此类按钮的示例 您可以通过创建自己的子类来做到这一点U
  • 水平 UICollectionView 单行布局

    我正在尝试使用以下命令设置简单的水平布局UICollectionView 兜圈子却没有达到预期的结果 所以任何指针或例子将不胜感激 我粘贴经常更改的代码但没有成功可能没什么意义 该图像显示两行 第一行是单个项目 尺寸正确并且在中心正确对齐
  • 加载新控制器时,iPhone 横向模式切换到纵向模式

    我的应用程序在横向模式下正确启动并且运行良好 BOOL shouldAutorotateToInterfaceOrientation UIInterfaceOrientation interfaceOrientation if interf
  • 在 iOS 7 Safari 中,如何区分通过边缘滑动与后退/前进按钮的 popstate 事件?

    在 iOS 7 Safari 中 现在有两种后退 前进导航方式 使用底部的传统后退 前进按钮箭头或从屏幕边缘滑动 我正在使用动画在 ajax 应用程序中的页面之间进行转换 但如果用户通过边缘滑动进行导航 我不想触发该转换 因为这本身就是一个
  • PFQueryTableViewController 错误

    我正在遵循在线教程 使用 Parse 作为后端创建照片共享应用程序 我已经运行了两次教程 两次都从头开始创建应用程序 但在同一位置仍然出现相同的错误 我到处寻找解决方案 但仍然没有运气 我正在使用 PFQueryTableViewContr
  • Xcode 8 / Swift 3:“UIViewController 类型的表达式?未使用”警告

    我有以下函数 它之前编译得很干净 但在 Xcode 8 中生成警告 func exitViewController navigationController popViewController animated true UIViewCon
  • 在发生更改事件时将货币格式重新应用到 UITextField

    我正在使用一个包含本地化货币值的 UITextField 我看过很多关于如何使用此功能的帖子 但我的问题是 如何在每次按键后将货币格式重新应用到 UITextField 我知道我可以通过以下方式设置和使用货币格式化程序 NSNumberFo
  • iOS - UITableViewCell 使文本加粗

    我有一个字符串 NSString userInfo James Johnson james 我想做的就是大胆James Johnson并保留 james正常字体 所以我尝试过的是使用NSAttributedString但为了完成这个过程 我

随机推荐

  • simplexml_load_file 和 simplexml_load_string 之间的区别

    我想将 xml 文件放入我的程序中并将其放入数组中 以便我可以将其放入表中 我想知道如何做到这一点 并且我已经阅读了 php 手册 但我似乎无法掌握它 为了做我想做的事 我需要使用simplexml load string 或者我需要命令他
  • Apache SetEnvIf 麻烦

    我的中有以下内容 htaccess file SetEnvIf Host example com myvar 1
  • 如何使用 XML::LibXML 解析 XML 文档并构建 Perl 哈希

    我有这样的 XML 数据
  • 如何用Flutter实现position:sticky和bottom 0?

    我想建立一个带有粘性页脚的列表视图 例如本文的 粘到底 在颤振中 In CSS main footer position sticky bottom 0 但是 Flutter 该怎么办呢 我想要的是 可滚动的大内容 页脚 粘性 可滚动的大内
  • JavaScript 闭包和 setTimeout

    闭包是我在 JS 中还没有完全掌握的东西 我认为这是一个封闭问题 我正在尝试创建一个进度条 每隔 x 秒我想增加 DIV 的宽度 这是应该执行此操作的部分 for i 0 i lt counter i setTimeout function
  • System.Drawing.Graphics.DpiX 始终返回 96

    我有 vb net winform 应用程序 自动缩放模式 dpi 自动缩放 假 自动调整大小 true 更改 DPI 设置后我已退出 我也尝试过重新启动机器 Using g As Graphics form CreateGraphics
  • 如何将我的代码从 v11 迁移到 Discord.js v12?

    我升级到 Discord js v12 但它破坏了我现有的 v11 代码 以下是导致错误的一些示例 TypeError client users get is not a function const user client users g
  • Android 中用颜色填充 ArrayList

    我想创建2个ArrayList 一种持有 16 种颜色 另一种持有 139 种颜色 我有颜色列表 RGB 为 255 126 32 十六进制为 0xFFFF2552 我想使用 ArrayList 稍后从中选择随机颜色 我试过 int 但不起
  • 在通过管道将 STDOUT 传输到文件时捕获 STDERR 的输出

    我的情况很奇怪 我正在尝试使用 Perl 自动备份 SVN 存储库集合 我正在使用 svnadmin dump 命令 该命令将转储发送到 STDOUT 并将遇到的任何错误发送到 STDERR 我需要运行的命令的形式为 svnadmin du
  • 对可拖动项目应用双击

    我有一个黄色按钮 可以将其拖放到灰色面板上 我使用 handleDragStop 函数来处理用户拖放黄色按钮时需要完成的所有任务 一切都很好 但是 我想知道如何启用用户双击黄色按钮的行为并具有与拖放时相同的行为 top icon dragg
  • c# 自定义 Dictionary 接受重复键进行序列化

    我需要实现一个有点类似字典的自定义功能 但可以插入重复的键 所以基本上我需要从 Dictionary 中得到的是将对象序列化为以下 JSON 的可能性 One Value 1 Two Value x One Value 10 Two Val
  • 如何通过 Watin 中的代码关闭弹出窗口拦截器?

    我在通过 watin 代码关闭弹出窗口阻止程序时遇到麻烦 谁能帮我知道如何通过 watin 关闭 IE 的弹出窗口拦截器 如果 IE 中安装了工具栏 如 google yahoo 或 msn 的弹出窗口拦截器 有什么方法可以关闭它们吗 提前
  • 推荐用于托管许多独立补丁的 DVCS 机制

    我有一个项目刚刚开始http sourceforge net projects iotabuildit 更多详细信息请参见http sourceforge net p iotabuildit wiki Home 当前正在使用 Mercuri
  • 如何在ReactJS中使用video元素的playbackRate参数?

    我需要你的帮助来修复我的代码 class header extends Component playVideo You can use the play method as normal on your video ref this ref
  • Lua 5.2 添加 luasocket (不稳定)

    我正在尝试将 luasocket 与 lua 5 2 一起使用 我从 git 存储库下载了代码并构建了它 然后进行 make install 以便生成 core dll 和 mime dll 将它们放入正在开发的自定义 lua 程序目录 C
  • ExpectIt:实施 sudo -i 时遇到问题

    我正在创建一个 Web shell 客户端并成功创建了一个简单的终端 我可以执行基本命令 但我需要执行sudo i并传递密码 发送 sudo i 命令后 我 期望 新用户 作为 root 提示 但 期望 永远等待 我可以看到提示符合预期 该
  • 在下游生成新的 Windows 窗体时如何使用 DI?

    我的 Unity DI 容器正在运行最初与我的 Windows 窗体应用程序 在Program cs我有以下内容 static void Main var container BuildUnityContainer Application
  • 在 jqGrid 中的 loadBeforeSend 上设置 Url

    我有一个用于大量报告的 wcf 服务 该服务将 json 数据返回到我的 jqgrid 一切都按预期进行 但是 由于每个报告查询有大量用户输入 我选择使用与我在服务器上设置的一系列 输入模型 相匹配的 json 字符串 我不想在我的路线中弄
  • 调用 finish() 并重新启动应用程序后,Timber 重复日志

    我有一个触摸监听器在我的 TextView 上 在触摸时 我登录Timber i 然后我打电话finish 如果在 finish 之后 我再次启动我的应用程序 并再次单击 TextView 它将记录两次 然后 3 次 依此类推 如果我用普通
  • 当单元格尚未构建时,如何计算 heightForRowAtIndexPath?

    问题 如何最好地计算 UITableViewController 的 heightForRowAtIndexPath 方法中一行的高度 假设 我正在使用自定义子类 UITableViewCell 子视图的实际大小 例如 UILabels 是