UITableViewCell需要reloadData()来调整大小以正确高度

时间:2015-08-17 21:30:37

标签: ios uitableview ios8 resize storyboard

我有一个带有应用约束的自定义tableview单元格,但是第一次显示表格时行高度没有正确调整大小,除非创建新单元格,有没有办法在不重新调用reloadData的情况下执行此操作?

1 个答案:

答案 0 :(得分:2)

是。这实际上是一个自我调整的问题,你需要解决它,直到它被修复。

问题是当实例化单元格时,其初始宽度基于故事板宽度。由于这与tableView宽度不同,因此初始布局错误地确定了内容实际需要的行数。

这就是为什么内容第一次没有正确调整大小,但是一旦你(重新加载数据)或者在屏幕外滚动单元格然后在屏幕上显示就会正确显示。

您可以通过确保单元格的宽度与tableView宽度匹配来解决此问题。您的初始布局将是正确的,无需重新加载tableView:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    [cell adjustSizeToMatchWidth:CGRectGetWidth(self.tableView.frame)];

    [self configureCell:cell forRowAtIndexPath:indexPath];

    return cell;
}

在TableViewCell.m中:

- (void)adjustSizeToMatchWidth:(CGFloat)width
{
    // Workaround for visible cells not laid out properly since their layout was
    // based on a different (initial) width from the tableView.

    CGRect rect = self.frame;
    rect.size.width = width;
    self.frame = rect;

    // Workaround for initial cell height less than auto layout required height.

    rect = self.contentView.bounds;
    rect.size.height = 99999.0;
    rect.size.width = 99999.0;
    self.contentView.bounds = rect;
}

我还建议查看smileyborg的excellent answer about self-sizing cells以及他的sample code。当我碰到你遇到的同样问题时,这就是解决方案的原因。

<强>更新

configureCell:forRowAtIndexPath:是Apple在其示例代码中使用的方法。当您有多个tableViewController时,通常会对其进行子类化,并在每个视图控制器中分解特定于控制器的cellForRowAtIndexPath:代码。超类处理公共代码(例如出列单元格)然后调用子类,以便它可以配置单元格的视图(从控制器到控制器会有所不同)。如果您不使用子类,只需将该行替换为特定代码即可设置单元格(自定义)属性:

    cell.textLabel.text = ...;
    cell.detailTextLabel.text = ...;