有效地确定一个自定义变量大小的UITableViewCell

问题描述:

首先,我所知道的,和经常使用的高度,有效地确定一个自定义变量大小的UITableViewCell

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

...这个问题是一个小比:-)更复杂

我有一个数据驱动的自定义UITableViewController。根据运行时表的定义,它会引入一系列自定义单元格(它们本身就是单独的自定义UITableViewCell类)。

自定义单元格也是数据驱动的,并且具有仅在运行时确定的高度。

通过执行一些运行时日志记录,我看到UITableViewController在为可见单元格调用cellFor ...之前调用表格中的所有单元格的heightFor ...。

这意味着我将有效地构建单元格以确定高度,然后在请求时再次返回单元格。

是否以任何方式通过heightFor返回高度的默认值,然后在实际高度已知时重写此值?

或者有没有其他解决方案可以避免构建细胞两次?

建议感激。

OK,所以这里没有很好的解决方案(即你不能改变的高度一旦它被创建,一个单元格)。

所以,我在这里的解决方案是调用cellFor ... from heightFor ...,它构造单元格以获得高度。然后我记录该单元格的高度作为属性,并从高度获得它...

获得高度后,单元格会自动释放(因为它不会被保留)。当然,不久之后,UITableController会再次请求单元,所以它将被构造两次,但这就是它的方式......

这是代码,这很好。

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    float height; 

    UITableViewCell <CMyTableViewDelegate> *cell = (UITableViewCell <MyTableViewDelegate> *) [self tableView:tableView cellForRowAtIndexPath:indexPath]; 

    height = [cell getHeight]; 

    return height; 
} 

希望能帮助别人。

+0

有趣的是,这个问题在Facebook应用程序本地重写的博客条目中也提到过,http://www.macrumors.com/2012/08/24/engineers-detail-extensive-efforts-to-rewrite- Facebook的IOS-应用程序/ – Snips 2012-08-24 23:22:11

不,这是不可能的。再考虑解决方案。我会给你几个指针。

  • 缓存计算的高度uitablebiewcell本身的
  • 检查性能。也许它有太多的子视图。
  • 预先计算的高度如果可能的话 - 前表视图的数据源,让你做这样做,那么返回缓存的高度