从 -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 高度:?的主要内容,如果未能解决你的问题,请参考以下文章

从PRISM开始学WPFMVVMViewModel?

在 python 中,为啥从数组读取比从列表读取慢?

从图库中挑选或从相机捕获的高质量图像

从PRISM开始学WPFMVVMCommand?

从PRISM开始学WPFPrism?

mysql 主-主-从-从