1

由于heightForRowAtIndexPath之前调用过cellForRowAtIndexPath,我假设如果我想从内部修改高度cellForRowAtIndexPath,我可以这样做。好像我做不到。我已经通过测试NSLog,如果我更改cell.frame.size.height,更改会正确存储在其中,但单元格本身不会采用新的大小(它使用的是我在 中设置的那个heightForRowAtIndexPath)。

是否有另一种方法可以调整在某个时间点调用的单元格高度cellForRowAtIndexPath?如果没有,还有其他方法可以解决这个问题吗?我需要使用cellForRowAtIndexPath,因为我正在动态决定是否依次将图像随机添加到每个单元格。

4

4 回答 4

6

UITableViewDelegate heightForRowAtIndexPath并且UITableView rowHeight是指定单元格高度的唯一机制。表格视图本身正在根据这些调整单元格的大小;你不能自己设置你的细胞框架并期望它工作。

您可以做的最好的事情是能够在创建单元之前提前计算您的单元高度。我经常会定义一个+ (CGFloat) cellHeightWithDatum: (id) datum forWidth: (CGFloat) tableWidth方法来调用我的单元格类heightForRowAtIndexPath。这里的基准是驱动单元格内容的模型。然后,此方法查看模型并计算出细胞需要多高。

如果您在创建单元格后绝对需要更改单元格的高度,您可以通过要求 tableview 重新加载单元格来完成此操作,或者在不调用 reloadData 的情况下刷新整个表格。这个技巧是通过以下方式完成的:

[tableView beginUpdates];
[tableView endUpdates];

要重新加载单个单元格: UITableView reloadRowsAtIndexPaths:withRowAnimation:

于 2013-02-28T16:32:36.007 回答
2

您应该将随机决定添加图像的代码放入您的heightForRowAtIndexPath方法中。

使用 aNSMutableDictionary来跟踪NSIndexPath使用图像的 。

于 2013-02-28T16:24:19.433 回答
0

您需要跟踪需要扩展的索引。

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

    if([self shouldBeExpanded:indexPath.row]) { //method that checks if this cell should be expanded. You'll need to check the array if it contains the row.
        return kCellHeightExpanded;
    }

    return kCellNormalHeight;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

     //set cell to be expanded
     [self expandCellAt:indexPath.row]; //method that sets which cell is expanded. You'll need to implement this yourself. Use an array to track which row should be expanded

     //this causes heightForRowAtIndexPath: to be called again
     [tableView beginUpdates];
     [tableView endUpdates];
}
于 2013-02-28T16:36:59.727 回答
0

您应该在 cellForRowAtIndexPath 之前的某个时间随机决定,然后在每个 indexPath 的 dataSource 中的数据结构中存储一个标志,以确定那里是否会有图像。如果决定是否存在图像的工作成本低廉,您可以在 heightForRowAtIndexPath 中执行此操作。像这样的东西:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    BOOL showingAnImage = arc4random() % 2;
    // self.imageIndexPaths is some data structure that lets you associate a value to an index path
    self.imageIndexPaths[indexPath] = @(showingAnImage);
    if (showingAnImage){
        // return height of a cell with an image
    } else {
        // return height of a cell without an image
    }
}


- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *identifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];
    if ([self.imageIndexPaths[indexPath] boolValue]){
        // Configure for image
    } else {
        // Configre without image
    }
    return cell;
}

在 cellForRowAtIndexPath: 中更改单元格的大小将不起作用。

于 2013-02-28T16:26:49.570 回答