出队的UITableViewCell有不正确的布局直到滚动(使用自动布局)(dequeued UIT

2019-07-20 06:29发布

我有一个自定义UITableViewCell子类,这已经在Interface Builder应用了自动布局的限制。 该小区有多个视图,包括一个UITextField

相关地,所述的尺寸UITextField受到约束,使得有它和下一个视图之间默认水平间距。

小区被实例化类似如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"ProgressCell";
    ProgressCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier
                                                     forIndexPath:indexPath]

    cell.textField.text = @"Some string that is different for each cell";

    return cell;
}

当电池第一次出现,该UITextField超支正确的框架,并出现背后UIView其右侧。 然而,当我滚动池脱屏,暂停,然后滚动回,文本被正确地截断。

一个例子如下所示(在第二编辑)。

我已经打过电话[cell setNeedsLayout][cell setNeedsDisplay]在细胞cellForRowAtIndexPath ,以及延迟一段时间后执行它们。 无论是有效的。

什么是滚动关闭屏幕这样做导致细胞正常显示,我怎么可以复制这个或解决潜在的问题?

编辑:

调用

[self.tableView reloadData];
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];

为了重新加载单元,会出现以使布局出现正确的第一次。

然而,现在打破 (偶尔)上滚动(即滚动备份时,布局限制,现在无法正常使用)。

调用[cell setNeedsLayout]cellForRowAtIndexPath似乎没有解决这个问题。

EDIT2:

顶部电池,如图所示这里 ,似乎正确(如底部电池一样),直到我向下滚动屏幕。 它从此失踪。

这反映了一个问题,因为第一次编辑的 - 这是第二渲染,这是问题(让我觉得它可能是与重用细胞?)

Answer 1:

如果你的名字在一个属性UITableViewCell子类textLabeldefaultTextLabel ,则1B将忽略您所指定的约束,并与默认的覆盖它们,并没有发出警告。

这是即使在设计与IB自定义样式细胞,有没有明显的情况下textLabeldetailTextLabel性能。

这也发生,如果添加类型的属性UIImageView上的属性UITableViewCell子类,并将其命名为imageView



Answer 2:

按照这个多行UILabel GitHub上的问题 ,这是一个挥之不去的iOS漏洞。

我发现,在iOS的9+,这种情况多发生在编辑模式下,很多不可预测性。

下面的解决方法只能部分工作原理:它需要重新绘制UITableView两次,仍不能涵盖所有情形。

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.setNeedsLayout()
    tableView.layoutIfNeeded()
    tableView.reloadData()
}

笔记:

  • 使用UITextView是一个伟大的替代多行UILabel ,没有错误。 UITextView不表现出任何的IULabel其他奇特或者,像对准误差或闪烁 。
  • 还有的一种替代解决方案SO-25947146 ,这并没有为我工作,但值得一提的。
  • 似乎什么时候发生显着self.tableView.editingtrue
  • 使用低值tableView.estimatedRowHeight降低了发生
  • 在错误的示范SwiftArchitect / TableViewControllerRowHeightBug要点


文章来源: dequeued UITableViewCell has incorrect layout until scroll (using autolayout)