使用多个视图 iphone 计算自定义单元格高度
Posted
技术标签:
【中文标题】使用多个视图 iphone 计算自定义单元格高度【英文标题】:Calculate custom cell height with multiple views iphone 【发布时间】:2010-07-12 11:38:49 【问题描述】:我想用标签、图像视图、按钮等多个子视图计算我的自定义单元格高度。
如何计算这个像元大小?
似乎不建议在cellForRowAtIndxPath中这样做,在heightForRowAtIndexPath中也取一个Cell的实例,它进入无限循环。
我能够计算自定义单元格类中单元格的高度,但我不确定我应该在哪里返回它。
由于heightForRowAtIndexPath方法没有获取单元格实例,如何告诉该方法我要渲染计算高度的单元格类型?
感谢任何帮助。
提前感谢。
【问题讨论】:
【参考方案1】:理想情况下,您应该能够计算单元格的高度,而无需为其创建单元格。 tableView:heightForRowAtIndexPath:
将为表格中的每个单元格(不仅仅是屏幕上的单元格)调用,如果您必须在该方法中创建一个完整的单元格对象,它可能会对性能产生很大影响。
您必须根据indexPath
参数推导出单元格的类型,就像在tableView:cellForRowAtIndexPath:
中一样
【讨论】:
我有不同类型的单元格和许多子视图。你能建议任何理想的位置来计算不同细胞的大小吗?我必须使用单元标识符来区分它们吗?我尝试将 cell.frame 设置为 CGRectZero 但它对我不起作用.. 只能计算tableView:heightForRowAtIndexPath:
中的高度。如果您还需要这些值来设置单元格元素的高度,则应将计算放在单独的方法中。如果在tableView:heightForRowAtIndexPath:
和tableView:cellForRowAtIndexPath:
中计算高度会影响您的性能,您应该缓存在tableView:heightForRowAtIndexPath:
中计算的值。
好的,同意.. 在这种情况下,我可以通过获取所有子视图并累积它们的高度来计算单元格高度,但为此我需要一个 UITableViewCell 实例。我怎样才能做到这一点?使用 cell = [tableView cellForRowAtIndexPath:indexPath];使它成为一个无限循环。如果我能够做到这一点,那么即使我也不需要去“区分细胞”部分。谢谢。【参考方案2】:
您始终可以将单元格加载到viewWillAppear
或viewDidLoad
,然后将它们添加到NSArray
。然后,在tableView:heightForRowAtIndexPath:
中,使用提供的indexPath
,返回数组中相关单元格的高度。然后,在tableView:cellForRowAtIndexPath
中,再次使用提供的indexPath
,返回数组中的相关单元格。
请注意:
如果您有很多单元格,这可能会导致您的 UI 在加载单元格时锁定。为避免这种情况,您可以创建一个自定义方法来填充数组,并在后台线程上执行它。
此外,如果花费的时间太长,tableView
将不会显示您的所有单元格,因为您的数组不会被完全填充。这意味着您应该在填充数组后调用[tableView reloadData];
。
【讨论】:
是否必须使用单元格标识符来区分 heightForRowAtIndexPath 中的单元格?在这个方法中如何获取单元格的实例? 您不需要使用单元格标识符来区分单元格。相反,使用tableView:heightForRowAtIndexPath
和tableView:cellForRowAtIndexPath
提供的indexPath
- 访问indexPath
的行和部分属性,并使用objectAtIndex:
访问数组中的相关单元格。【参考方案3】:
我是这样做的:
我在名为 category_type 的 tableview 中按照它们出现的顺序创建了一个单元格的数组,然后我检查了类别类型并计算了基于文本的控件的高度以计算单元格的整个高度。
NSString *category = [NSString stringWithFormat:[category_type objectAtIndex:indexPath.row]];
if([category isEqualToString:@"xyz"])
xyzInstance = [arrayWithObjectsToLoad objectAtIndex:indexPath.row];
float textHeight = [MLUtils calculateHeightOfTextFromWidth:editorialInstance.eletitle : [UIFont fontWithName:@"Helvetica" size:13.0] :320 :UILineBreakModeWordWrap]; //Dyanamic label height
totalHt = 171 - 21 + textHeight + 20; // My calculation for text part of label
return totalHt;
我对所有类别都这样做了。
【讨论】:
以上是关于使用多个视图 iphone 计算自定义单元格高度的主要内容,如果未能解决你的问题,请参考以下文章