0

在我的应用程序中,它有大约一千个内容要显示在 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 秒,所以用户体验不是很好,因为在计算过程中应用程序将没有响应。那么计算这些细胞高度的正确方法是什么,正确的位置在哪里?

更新

数据来自服务器并在进入表视图时请求。

4

4 回答 4

1

当您从服务器加载数据时,无论如何都会有延迟。

=> 我建议您在重新加载表格/移除微调器等之前在后台进行高度计算。

// 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];
}
于 2013-01-08T08:17:38.093 回答
1

我通常将它放入我的自定义单元子类中......所以代码不会弄乱我的控制器并且对于我使用的单元是正确的。(+这样更适合MVC......单元格的高度是IMO的视图属性)

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

于 2013-01-08T08:26:36.763 回答
0

How do you set/get self.tmpCell ? Do you save the reusable cell in a property?

Instead getting text from cell and calculating the size you can calculate the size of text from data source of the cell. I mean you set the texts in cellForRowAtIndexPath: somehow (eg. from an array) just use the text from that to calculate it.

For the frame : The cells have the same width of tableview For the font : Just write a method called

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

and use it also from cellForRowAtIndexPath. It makes your job easier if you change the fonts of texts later.

于 2013-01-08T07:57:31.033 回答
0

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

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

下次数组有一个值时,无需计算就可以使用它。

于 2013-01-08T07:49:56.697 回答