从 -tableView:cellForRowAtIndexPath: 计算“indexPath”处的自定义 UITableViewCell 高度:?
Posted
技术标签:
【中文标题】从 -tableView:cellForRowAtIndexPath: 计算“indexPath”处的自定义 UITableViewCell 高度:?【英文标题】:Calculate custom UITableViewCell height at "indexPath" from -tableView:cellForRowAtIndexPath:? 【发布时间】:2013-04-05 21:00:35 【问题描述】:我在自定义类里面调整了一个自定义UITableViewCell
的高度,我相信我需要使用-tableView:cellForRowAtIndexPath:
方法来调整单元格的高度。我试图在自定义单元格类中调整自定义单元格的高度,然后在给定的索引路径中抓取单元格,然后返回该单元格的高度,如下所示:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
CustomUITableViewCell *cell = (CustomUITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
return cell.frame.size.height;
但是我遇到了堆栈溢出。有什么更好的方法来解决这个问题?
【问题讨论】:
【参考方案1】:表格视图delegate
会先调用heightForRowAtIndexPath:
,然后datasource
会根据计算得到的信息在cellForRowAtIndexPath:
中构造单元格。
因此,您的方法将行不通。
您需要有一些逻辑来计算高度。 (例如,如果您正在显示文本,则高度可能是动态的并且取决于文本的数量 - 您可以使用 NSString
方法来计算。)
如果您只是显示几种具有固定高度的单元格,只需将这些高度定义为常量,并根据您在 cellForRowAtIndexPath:
中的相同逻辑返回正确的高度来决定使用哪个单元格。
#define kBasicCellHeight 50
#define kAdvancedCellHeight 100
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath
if (needToUseBasicCellAtThisIndexPath)
return kBasicCellHeight;
return kAdvancedCellHeight;
【讨论】:
【参考方案2】:如果是故事板单元格,您可以致电dequeueReusableCellWithIdentifier:
。否则,您可以直接使用 [CustomUITableViewCell alloc] initWithFrame:]
之类的东西来实例化单元格。
我自己使用这种方法(使用原型单元格来计算高度),因为它允许我们的设计师修改故事板单元格而无需更改代码。
您可能希望根据here 讨论的高度是静态的还是动态的来调整您的方法。
【讨论】:
我想说@Mundi 的建议更好/更简单,除非(a)您想在不更改代码的情况下修改故事板中的单元格高度,或者(b)您的单元格需要计算其高度/布局和您不想在视图控制器中复制该逻辑。以上是关于从 -tableView:cellForRowAtIndexPath: 计算“indexPath”处的自定义 UITableViewCell 高度:?的主要内容,如果未能解决你的问题,请参考以下文章