如何询问 UITableViewCell 的高度?
Posted
技术标签:
【中文标题】如何询问 UITableViewCell 的高度?【英文标题】:How to ask a UITableViewCell its height? 【发布时间】:2014-08-21 18:21:02 【问题描述】:按照https://***.com/a/7313410/1971013,我需要获取- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
中每个单元格的高度。
但是当我这样做时:
- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
MyTableViewCell* cell = (MyTableViewCell*)[self.tableView cellForRowAtIndexPath:indexPath];
return cell.height;
这(当然)会导致不必要的递归炸毁我的应用程序。
关于我应该如何做到这一点的任何想法?
【问题讨论】:
使用heightForRowAtIndexPath
定义单元格的高度,但您试图返回单元格的默认高度44
,而不是我建议您设置一些条件并返回一些实际的价值观..
这样想——你不是问一个单元格的高度,而是告诉一个单元格的高度。这就是 heightForRowAtIndexPath
方法的用途 - 告诉单元格它的高度是多少。
@maddy 我知道,但在我的情况下,单元格知道它们需要多高才能显示其内容。
【参考方案1】:
遗憾的是,最好的答案是,我不知道。这取决于你。来自UITableViewDelegate
的heightForRowAtIndexPath
是UITableView
用来询问你的高度应该是多少。在这个函数中,你正在确定。
也许你可以在dequeueReusableCellWithIdentifier
之后将它保存在cellForRowAtIndexPath
的自己的记忆中。
但是,如果您的链接问题有任何迹象,那么您正在尝试扩展选定的单元格,对吗?您可以通过
确定它是否是选定的单元格if ([indexPath compare:[tableView indexPathForSelectedRow]] == NSOrderedSame)
return 88; // some expanded value
else
return 44; // the default value
【讨论】:
那行不通 - 表格视图想知道每个单元格的高度,而不仅仅是实例化的单元格。 这就是我的观点——在通过cellForRowAtIndexPath
绘制任何单元之前,每个(潜在)单元都会调用heightForRowAtIndexPath
。【参考方案2】:
Gutblender 是对的:在通常情况下,您不会询问单元格的高度,而是告诉它。
接受细胞可回收这一事实很重要。从实际的角度来看,您无法检查屏幕外的单元格,因为它们不存在。
除了注意事项,以下是选项:
创建一个定义表格视图单元格高度的方法,并使用该方法计算从 heightForRowAtIndexPath 返回的值。然后,您可以从其他地方调用该方法来确定单元格在给定索引路径上的高度,无论它是否存在。这是标准方法。 99.9% 的情况下,它也是正确的。
遍历表视图的子视图。一个坏主意,因为您不控制 NSTableView 类,并且视图层次结构可以更改。而且,再次:细胞被回收。
创建自定义表格视图单元类,使用类似 MVVM 设计模式的东西,让您的模型对象出售表格视图单元。您不必担心视图层次结构,但同样:单元格被回收——您最终将管理陈旧或不正确的状态。
【讨论】:
【参考方案3】:我在静态表格视图上使用过的一种方法,它没有任何重用并且单元格是预先生成的,是创建一个具有高度属性的子类 tableView 单元格,因此在 heightForRowAtIndexPath 中,您可以获得该 indexPath 的单元格并返回你硬编码的单元格的高度,你想要的单元格。这样,任何时候您想更改高度都可以直接在单元格本身上进行更改,并且当您重新加载数据时,它应该更新单元格高度。
【讨论】:
以上是关于如何询问 UITableViewCell 的高度?的主要内容,如果未能解决你的问题,请参考以下文章
如何根据 UIImageView 高度设置不同的 UITableViewCell 高度?
如何增加 UItableviewcell 内的 UItableview 高度?