dequeued UITableViewCell具有不正确的布局,直到滚动(使用autolayout)

sap*_*api 21 iphone objective-c interface-builder ios

我有一个自定义UITableViewCell子类,它在Interface Builder中应用了autolayout约束.单元格包含多个视图,包括a 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;
}
Run Code Online (Sandbox Code Playgroud)

当单元格首次出现时,UITextField超出正确的框架,并显示在UIView其右侧后面.但是,当我将屏幕上的单元格滚动,暂停,然后向后滚动时,文本会被正确截断.

下面显示了一个示例(在第二次编辑时).

我已经尝试过调用[cell setNeedsLayout][cell setNeedsDisplay]进入单元格cellForRowAtIndexPath,以及延迟后执行它们.两者都没有效果.

什么是滚动屏幕执行该操作导致单元格正确显示,我该如何复制或修复底层问题?

编辑:

调用

[self.tableView reloadData];
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];
Run Code Online (Sandbox Code Playgroud)

为了重新加载单元格,似乎导致布局第一次正确显示.

但是,它现在在滚动时(偶尔)中断(即,当向上滚动时,布局约束现在未正确应用).

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

EDIT2:

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

这反映了第一次编辑时的问题 - 第二次渲染是问题(让我觉得它可能与重用单元格有关?)

sap*_*api 38

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

甚至在具有Custom样式的IB中设计的单元格中也是如此,该样式没有可见textLabeldetailTextLabel属性.

如果UIImageViewUITableViewCell子类上添加type 属性并为其命名,也会发生这种情况imageView.

  • "imageView"属性也是如此. (4认同)
  • 这个答案需要提升到UITableViewCell类引用中,我只是浪费了4个小时的生命.早上4点...... (4认同)

Swi*_*ect 8

按照GitHub这个多行UILabel问题,这是一个挥之不去的iOS bug.

我发现在iOS 9+中,这种情况主要发生在编辑模式中,具有很大的不可预测性.

以下解决方法仅部分有效:它需要重新绘制UITableView两次,但仍未涵盖所有方案.

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.setNeedsLayout()
    tableView.layoutIfNeeded()
    tableView.reloadData()
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 使用UITextView是多行的一个很好的替代品UILabel,没有bug.UITextView不会出现任何IULabel其他奇怪现象,如对齐错误闪烁.
  • SO-25947146上还有另一种解决方案,它对我不起作用,但值得一提.
  • 似乎什么时候发生显着self.tableView.editingtrue
  • 使用较低的值可tableView.estimatedRowHeight减少发生的次数
  • 演示SwiftArchitect/TableViewControllerRowHeightBug要点上的错误