Iphone 退出队列的UITableViewCell在滚动之前的布局不正确(使用自动布局)

Iphone 退出队列的UITableViewCell在滚动之前的布局不正确(使用自动布局),iphone,ios,objective-c,interface-builder,Iphone,Ios,Objective C,Interface Builder,我有一个自定义的UITableViewCell子类,它在Interface Builder中应用了自动布局约束。该单元格包含多个视图,包括UITextField 相应地,UITextField的大小受到约束,以便在它和下一个视图之间有默认的水平间距 单元格的实例化如下所示: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { sta

我有一个自定义的
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]
中的单元格,并在延迟后执行这些操作。两者都没有效果

屏幕外滚动是什么导致单元格正确显示的?我如何复制此操作或修复潜在问题

编辑:

召唤

[self.tableView reloadData];
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];
要重新加载单元格,显示将使布局第一次正确显示

但是,它现在在滚动时(偶尔)会中断(即,当向后滚动时,布局约束现在没有正确应用)

cellforrowatinexpath
中调用
[cell setNeedsLayout]
似乎无法解决此问题

编辑2:

如图所示,在我向下滚动屏幕之前,顶部单元格显示正确(与底部单元格一样)。它从此消失了


这反映了第一次编辑时的问题-问题出在第二次渲染时(使我认为这可能与重用单元格有关?

如果在
UITableViewCell
子类
textlab
defaulttextlab
上命名属性,然后IB将忽略您指定的约束,并使用默认约束覆盖它们,而不会发出警告

即使在使用自定义样式在IB中设计的单元格上也是如此,这些单元格没有可见的
textlab
detailtextlab
属性

如果在
UITableViewCell
子类上添加类型为
UIImageView
的属性,并将其命名为
imageView
,也会发生这种情况,这是一个挥之不去的iOS错误

我发现在iOS9+中,这种情况大多发生在编辑模式下,具有很大的不可预测性

以下解决方法仅部分起作用:它需要重新绘制
UITableView
两次,但仍不能覆盖所有场景

override func viewDidLoad() {
    super.viewDidLoad()

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

注意事项:

  • 使用
    UITextView
    是多行
    UILabel
    的一个很好的替代方法,没有bug
    UITextView
    不显示任何
    IULabel
    其他异常,如或
  • 还有一个关于的替代解决方案,它对我不起作用,但值得一提
  • self.tableView.editing
    true
  • tableView.EstimateDrowEight使用较低的值可减少发生率
  • gist上的缺陷演示

您是否收到有关控制台中约束的任何警告?您能提供一些屏幕截图吗?@rdelmar我写了我的自动布局类别(我们之前没有讨论过吗?)如果您感兴趣:我在这里上传了一个示例图像:。控制台@rdelmar中没有约束警告-它们都是通过IB设置的,所以它们应该是有效的。我看不出这些约束有任何错误。我试图复制你的问题,但我的问题没有滚动就截断了长文本。如果将宽度约束设置为=而不是>=是否有帮助?你能删除其中一个吗(这取决于你对右边的另外两个对象拥有什么)?“imageView”属性也是如此。这个答案需要升级到UITableViewCell类引用中,我只浪费了4个小时的时间。现在是凌晨4点……非常感谢。你刚刚救了我几个小时的命。我希望Interface Builder或编译器能给你一个关于无意中重写这些属性名的警告。名为“maskView”的UIImageView属性也是如此。