有效地确定一个自定义变量大小的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;
}
希望能帮助别人。
答
不,这是不可能的。再考虑解决方案。我会给你几个指针。
- 缓存计算的高度uitablebiewcell本身的
- 检查性能。也许它有太多的子视图。
- 预先计算的高度如果可能的话 - 前表视图的数据源,让你做这样做,那么返回缓存的高度
有趣的是,这个问题在Facebook应用程序本地重写的博客条目中也提到过,http://www.macrumors.com/2012/08/24/engineers-detail-extensive-efforts-to-rewrite- Facebook的IOS-应用程序/ – Snips 2012-08-24 23:22:11