2013-02-21 83 views
18

我有一个自定义UITableViewCell子类,它已经在Interface Builder中应用了自动布局约束。该单元格包含多个视图,其中包括UITextField已出队UITableViewCell布局不正确,直到滚动(使用自动布局)

相关地,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:

顶部电池,如图here,正确显示(作为底电池那样),直到我向下滚动屏幕。它消失了。

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

+0

您是否获得有关在控制台的约束任何警告,tableView.estimatedRowHeight采用低值降低了错误的发生

  • 示范,突出发生的呢? – rdelmar 2013-02-21 07:20:59

  • +0

    你可以包含一些截图吗? – jrturton 2013-02-21 08:06:30

    +0

    @rdelmar如果你感兴趣,我写了我的Autolayout类别(以前不曾讨论过?):http://commandshift.co.uk/blog/2013/02/20/creating-individual-layout-constraints/ – jrturton 2013-02-21 08:08:58

    回答

    36

    UITableViewCell子类textLabeldefaultTextLabel,那么IB将忽略您指定的约束并用默认约束覆盖它们,而不会发出警告。

    甚至在IB中使用自定义样式设计的单元格上也是如此,它没有可见的textLabeldetailTextLabel属性。

    如果在UITableViewCell子类中添加UIImageView类型属性并将其命名为imageView,也会发生这种情况。

    +4

    “imageView”属性也是如此。 – RickiG 2013-08-28 08:46:45

    +4

    这个答案需要被提升到UITableViewCell类的引用中,我只是浪费了4个小时的生命。它的早晨4 ... – atreat 2013-11-16 09:01:33

    +0

    非常感谢。你刚刚救了我几个小时的生命。 – 2014-04-22 12:38:43

    4

    根据这个multiple lines UILabel GitHub issue,这是一个持续不断的iOS错误。

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

    以下解决方法仅部分起作用:它需要重绘两次UITableView,但仍未涵盖所有方案。

    override func viewDidLoad() { 
        super.viewDidLoad() 
    
        tableView.setNeedsLayout() 
        tableView.layoutIfNeeded() 
        tableView.reloadData() 
    } 
    

    注: