当前位置: 首页 > 知识库问答 >
问题:

UITable查看动态单元格高度仅在滚动一些后才正确

毕宏盛
2023-03-14

我有一个UITableView,其中包含使用自动布局在故事板中定义的自定义UITableViewCell。单元格有几个多行UILabels

UITableView似乎可以正确计算单元格高度,但对于前几个单元格,标签之间的高度没有正确划分。滚动一点后,一切都按预期工作(即使是最初不正确的单元格)。

- (void)viewDidLoad {
    [super viewDidLoad]
    // ...
    self.tableView.rowHeight = UITableViewAutomaticDimension;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    TableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"TestCell"];
    // ...
    // Set label.text for variable length string.
    return cell;
}

有没有什么我可能会遗漏的,导致自动布局在最初的几次无法完成它的工作?

我创建了一个示例项目来演示这种行为。

共有3个答案

颜霖
2023-03-14

单元格中添加 [单元格布局如果需要] 对于最初滚动到视图外的单元格不起作用。

它前面也没有[cell setNeedsLayout]

您仍然需要将某些单元格向外滚动,然后再回到视图中,才能正确调整它们的大小。

这是非常令人沮丧的,因为大多数开发人员都有动态类型,自动布局和自调整大小的单元格正常工作 - 除了这个烦人的情况。此 bug 会影响我所有“更高”的表视图控制器。

符允晨
2023-03-14

当其他类似的解决方案不起作用时,这对我很有效:

override func didMoveToSuperview() {
    super.didMoveToSuperview()
    layoutIfNeeded()
}

这似乎是一个实际的bug,因为我非常熟悉AutoLayout以及如何使用UITableViewAutomaticDimension,但是我仍然偶尔会遇到这个问题。我很高兴我终于找到了一些工作的变通办法。

堵宏毅
2023-03-14

我不知道这是否清楚地记录下来,但是在返回单元格之前添加[单元格布局IfNeed]可以解决您的问题。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    TableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"TestCell"];
    NSUInteger n1 = firstLabelWordCount[indexPath.row];
    NSUInteger n2 = secondLabelWordCount[indexPath.row];
    [cell setNumberOfWordsForFirstLabel:n1 secondLabel:n2];

    [cell layoutIfNeeded]; // <- added

    return cell;
}
 类似资料:
  • 这是这样的场景:我有一个表格,其中有具有动态高度的单元格。在每个单元格中,我都有一个标签和一个开关。当我运行应用程序时,只能看到这两个,但然后我将开关设置为true,然后在这两个元素下出现一个(隐藏的?)文本视图,使单元格的高度更大。 我该怎么做呢?因为当我尝试隐藏元素时,也会出现。 我该怎么做?我尝试使用新的堆栈视图,它可以很好地处理它,但不是在表格单元格中。 我如何解决这个问题?

  • 对于我的表视图单元格的动态高度,我从此链接中引用。在 UITableView 中使用自动布局进行动态单元格布局 这是我的表视图数据源和委托方法的代码 我有 2 个问题: > 我的问题是我在线路附近收到错误 在和。 为什么我必须在单元格中同时写入标签文本“和? 另外,我是否缺少实现单元动态高度所需的任何内容?

  • 我有一个表格视图,每个单元格都有自己的高度,因此不适合使用。相反,现在我使用和。这意味着它调用单元格上的函数来确定它的高度。这一切都很好。 问题是当你重新加载屏幕上的单元格时。例如,向下滚动以显示单元格10,然后重新加载单元格10,效果很好。但是当您开始向上滚动,经过您已经看到的单元格时,它会恢复到每个单元格的estimatedRowHeight,完全不考虑< code>sizeThatFits,

  • 问题内容: 我正在使用iOS 8新的自动调整大小的单元格。外观上效果很好-每个单元格都有合适的大小。但是,如果我尝试 滚动到最后一行 ,则表视图似乎不知道其正确大小。这是一个错误还是有解决办法? 重新创建问题的方法如下: 使用这个项目-TableViewCellWithAutoLayoutiOS8(从该SO答案引用),我按预期得到了自动调整大小的单元格。 但是,如果我要调用 scrollToRow

  • 我需要显示一组具有不同高度的collectionViewCells。视图太复杂,我不想手动计算预期的高度。我想强制自动布局来计算单元格高度 在之外调用会破坏ColltionView并导致其崩溃 另一个问题是单元格不在单独的xib中,所以我无法手动实例化临时单元格并将其用于高度计算。 对此有什么解决办法吗? 编辑: 一旦被调用,就会发生崩溃。如果我不调用该方法并返回大小,则一切正常,单元格显示为没有

  • 我觉得这可能是一个常见的问题,我想知道是否有任何共同的解决方案。 基本上,我的UITableView拥有每个单元格的动态单元格高度。如果我不在UITableView的顶部,并且我< code > table view . reloaddata(),向上滚动会变得不稳定。 我认为这是因为我在向上滚动时重新加载了数据,UITableView正在重新计算每个可见单元格的高度。如何减轻这种情况,或者如何只