2013-01-08 46 views
0

在我的应用程序中,它有大约1000个内容显示在tableView中。每个内容都有不同的高度,因为其中有一到三行UILabel。目前,它计算并返回每个单元格的高度在的tableView委托功能:计算单元格高度的正确方法

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

它计算的方法是:

contentCell = (RSContentViewCell *)self.tmpCell; 
UIFont *font = contentCell.myTextLabel.font; 
width = contentCell.myTextLabel.frame.size.width + 30; 

size = [contentStr sizeWithFont:font 
    constrainedToSize:CGSizeMake(width, CGFLOAT_MAX) 
    lineBreakMode:contentCell.myTextLabel.lineBreakMode]; 

height = size.height; 
return height; 

它的工作原理,但需要大约0.5秒来计算的高度,所以用户体验不太好,因为在计算过程中应用程序将不会有任何反应。 那么什么是正确的方法和计算这些细胞高度的正确位置在哪里?

UPDATE

的数据是从服务器,并在该输入表格视图中的时间要求。

+0

这个函数一次调用需要0.5秒? –

+0

这听起来不正确。 – Fogmeister

+0

千个细胞需要0.5秒 –

回答

0

您仍然必须在前端执行此操作,但只执行一次并将结果缓存到Array中,并将其用于将来调用。

即第一次数组值是空的,所以计算它并将其存储在数组中。

下一次该数组有一个值,所以使用,而不必计算。

+0

那么我应该把计算代码放在哪里?由于这个函数只会在表视图重载数据时执行,所以缓存技术可能没有那么有用。 –

0

你如何设置/获取self.tmpCell?您是否将可重复使用的单元保存在一个属性中?

改为从单元格获取文本并计算大小,可以计算单元格数据源中文本的大小。我的意思是你以某种方式设置cellForRowAtIndexPath:中的文本(例如,从一个数组中)只需使用它的文本来计算它。

对于帧:该细胞具有的tableview 的相同的宽度对于字体:刚写一个称为

- (UIFont *)fontForCellAtIndexPath:(NSIndexPath *)indexpath 

方法,并且还使用它从cellForRowAtIndexPath。如果稍后更改文本的字体,它会使您的工作更轻松。

+0

self.tmpCell只会在第一次被'if(self.tmpCell == nil)'初始化。 –

+0

你不只有一个单元格,对吧?你只需将一些单元格保存在一个属性中。实际上,你无法知道iOS何时调用了你的heightForRowAtIndexPath方法,但你已经获得了indexPath。 Tableview可以同时拥有更多的单元格,但只保存一个单元格。我更新了我的答案 – Mert

1

因为您正在从服务器上传输数据,所以无论如何你都会有延迟。

=>我建议你做的身高在后台计算bevor重新加载表/删除微调等

// Method you call when your data is fetched 
- (void)didReciveMyData:(NSArray *)dataArray { 
    // start background job 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     self.myCachedHeightArray = [[NSMutableArray alloc] initWithCapacity:[dataArray count]]; 
     int i = 0; 
     for (id data in dataArray) { 
      float height; 

      // do height calculation 

      self.myCachedHeightArray[i] = [NSNumber numberWithFloat:height];// assign result to height results 
      i++; 
     } 

     // reload your view on mainthread 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self doActualReload]; 
     }); 
    }); 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return [[self.myCachedHeightArray objectAtIndex:indexPath.row] floatValue]; 
} 
1

我要把它放到我平时自定义单元格子......这样的代码没有按” t使我的控制器混乱,并且对于我使用的单元是正确的。 (+它更适合MVC这种方式......单元格的高度是一个视图属性IMO)

I不要测量每个单元格,但使用静态方法 - 请参阅https://github.com/Daij-Djan/TwitterSearchExampleApp(ViewController和DDTweetTableViewCell类举个例子)

+0

感谢您的示例 –

相关问题