我已经多次看到这个问题被问到,但令人惊讶的是,我没有看到一致的答案,所以我自己尝试一下:
如果您有一个包含您自己的自定义 UITableViewCells 的 tableview,其中包含 UITextViews 和 UILabels,其高度必须在运行时确定,那么您应该如何确定 heightForRowAtIndexPath 中每行的高度?
最明显的第一个想法是通过计算 cellForRowAtIndexPath 内单元格内每个视图的高度,然后求和来计算每个单元格的高度,并存储最终的总高度以供以后检索。
但这不起作用,因为 cellForRowAtIndexPath 是在 heightForRowAtIndexPath 之后调用的。
我唯一能想到的就是在 viewDidLoad 中进行所有计算,然后创建所有 UITableViewCells,计算单元格高度并将其存储在 UITableViewCell 子类内的自定义字段中,并将每个单元格放入 NSMutableDictionary 中,并以 indexPath 作为键,然后使用 cellForRowAtIndexPath 和 heightForRowAtIndexPath 内的 indexPath 从字典中检索单元格,返回自定义高度值或单元格对象本身。
但这种方法似乎是错误的,因为它没有使用 dequeueReusableCellWithIdentifier,而是我会将所有单元格一次加载到控制器中的字典中,并且委托方法除了从字典中检索正确的单元格之外什么也不做。
但我没有看到任何其他方法可以做到这一点。这是一个坏主意吗?如果是这样,正确的方法是什么?
Apple 实现 UITableView 的方式并不是每个人都直观,而且很容易误解其作用heightForRowAtIndexPath:
。总体意图是,这是一种更快、占用内存更少的方法,可以非常频繁地为表中的每一行调用。这与cellForRowAtIndexPath:
它通常速度较慢且占用内存较多,但仅针对在任何给定时间实际需要显示的行进行调用。
苹果为什么要这样实现呢?部分原因是计算行的高度几乎总是比构建和填充整个单元格更便宜(或者如果编码正确的话可能会更便宜)。鉴于在许多表格中每个单元格的高度都是相同的,因此它通常要便宜得多。和另一部分原因是因为 iOS 需要知道整个表格的大小:这允许它创建滚动条并将其设置在滚动视图等上。
因此,除非每个单元格高度都相同,否则当创建 UITableView 时,每当您向其发送 reloadData 消息时,都会向数据源发送每个单元格的 heightForRowAtIndexPath 消息。因此,如果您的表格有 30 个单元格,则该消息将发送 30 次。假设这 30 个单元格中只有 6 个在屏幕上可见。在这种情况下,当创建时并向其发送 reloadData 消息时,UITableView 将为每个可见行发送一个 cellForRowAtIndexPath 消息,即该消息被发送六次。
有些人有时对如何在不创建视图本身的情况下计算单元格高度感到困惑。但通常这很容易做到。
例如,如果行高大小因包含不同数量的文本而变化,则可以使用其中一种sizeWithFont:
方法对相关字符串进行计算。这比构建视图然后测量结果更快。请注意,如果更改单元格的高度,则需要重新加载整个表格(使用 reloadData - 这将询问委托的每个高度,但仅询问可见单元格)或有选择地重新加载大小已改变的行改变了(我上次检查时,也调用了heightForRowAtIndexPath:
在每一行but还做了一些滚动工作以达到良好的效果)。
See 这个问题 https://stackoverflow.com/questions/5294356/how-do-i-calculate-heightforrowatindexpath-when-the-cell-is-not-even-constructed/5296003#5296003也许还有this one https://stackoverflow.com/questions/7128215/ios-dynamic-height-with-a-custom-uitableviewcell/7130728#7130728.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)