Ios 在调用重载数据之前,Autolayout不正确地调整UITableViewCells的大小

Ios 在调用重载数据之前,Autolayout不正确地调整UITableViewCells的大小,ios,uitableview,autolayout,ios8,Ios,Uitableview,Autolayout,Ios8,我有一个tableview单元格,其视图从nib加载,其子视图使用AutoLayout进行约束。我正在使用iOS 8的自动调整单元格大小功能。在第一次显示时,单元格如下所示: 绿色视图与蓝色和灰色视图之间的间距比我预期的要大。如果我向下滚动视图以创建更多单元格,或者如果我在tableview上调用reloadData,那么我会得到正确的结果: 在第二次布局通过之前,单元子视图的大小似乎不正确。我怎样才能避开这件事?我看到一些帖子建议在layoutSubviews中设置setPreferred

我有一个tableview单元格,其视图从nib加载,其子视图使用AutoLayout进行约束。我正在使用iOS 8的自动调整单元格大小功能。在第一次显示时,单元格如下所示:

绿色视图与蓝色和灰色视图之间的间距比我预期的要大。如果我向下滚动视图以创建更多单元格,或者如果我在tableview上调用reloadData,那么我会得到正确的结果:

在第二次布局通过之前,单元子视图的大小似乎不正确。我怎样才能避开这件事?我看到一些帖子建议在
layoutSubviews
中设置
setPreferredMaxLayoutWidth
,如下所示:

-(void)layoutSubviews
{
    [super layoutSubviews];
    [self.redLabel setPreferredMaxLayoutWidth:[self.titleLabel bounds].size.width];
    [self.greenLabel setPreferredMaxLayoutWidth:[self.extendedLabel bounds].size.width];
    [self.blueLabel setPreferredMaxLayoutWidth:[self.dateLabel bounds].size.width];
    [self.grayLabel setPreferredMaxLayoutWidth:[self.tagsLabel bounds].size.width];
    [super layoutSubviews];
}
……但似乎没有效果

在我的约束中似乎没有任何模糊之处,但由于它们是在.nib中设置的,所以我不确定如何将它们发布到这里


编辑1:
因此,我将蓝色/灰色视图的顶部空间设置为>=绿色视图的底部,+3。这实际上就是我得到的,因为空间更大

但是,如果将关系设置为==,则会出现不同的视觉错误,其中红色标签的大小与其包含的文本量不符:


编辑2: 不确定我是否应该开始一个新问题,但这是同一个问题

布局仍有反复出现的问题,如编辑1中所示。除了视觉问题外,当我的tableview中的单个单元格发生更改时,它还会造成可怕的效果。整个列表将显示为折叠并重新加载。此外,我还记录了以下自动布局错误:

Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x797c5bc0 UITableViewCellContentView:0x7970adc0.(null) == UILabel:0x79707cf0.trailing + 6>",
    "<NSLayoutConstraint:0x7977b560 UILabel:0x79707cf0.leading == UITableViewCellContentView:0x7970adc0.(null) + 6>",
    "<NSLayoutConstraint:0x7970a700 UITableViewCellContentView:0x7970adc0.width ==>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x797c5bc0 UITableViewCellContentView:0x7970adc0.(null) == UILabel:0x79707cf0.trailing + 6>
下面列表中可能至少有一个约束是您不想要的约束。试着这样做:(1)看看每个约束,试着找出你不期望的约束;(2) 找到添加了不需要的约束的代码,然后修复它。(注意:如果您看到不理解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性TranslatesAutoResizingMaskToConstraints的文档)
(
"",
"",
""
)
将尝试通过打破约束进行恢复

其中提到的UILabel是较长的绿色标签。它似乎无法将前导约束和尾随约束与单元格的宽度相协调,就好像单元格的总宽度小于12点一样。然而,注销宽度似乎总是导致320。这可能不是布局问题,而是单元高度计算问题吗?我会再次检查您的估计重量(RowatineXpath)或高度(RowatineXpath)。

使用Xcode 6的视图调试工具,查看它是否与自动布局约束有关。如果你发现事实并非如此,那么@Niklasaers可能是对的

再补充一句,因为大多数人都建议了一些对我不起作用的东西,下面是我如何修复它的(iOS 8)。我使用XIB的细胞,但这应该是普遍的

首先,UILabel上有一个bug,其中未调用“-(void)layoutSubviews”,因此无法真正让iOS 7.0解决方案在iOS 8上运行。因此,我在iOS 8中使用自动调整单元格大小

但是,上面描述的错误正在发生。我必须重新加载表格视图才能使单元格正确。如果你看一些教程和例子,有很多很好用,而其他人则抱怨有bug。我在寻找错误示例和正确示例之间的共同点,错误是:大小类。


不要使用“紧凑宽度”和“任意高度”而使用“任意任意”。使用“任意任意”修复了所有问题,一切正常。听起来很可笑,但是试试看

好主意,但我的行高是UITableViewAutomaticDimension和estimatedRowHeight是88.0,这似乎不会影响视图大小。(我没有实现代理)。因此,我将蓝色/灰色视图的顶部空间设置为>=绿色视图的底部+3。这可能是造成问题的原因。但是,如果我将关系设置为==,我会得到一个不同的视觉错误(请参见问题编辑)。我在聚会上迟到了,但在单元格和大小类方面遇到了不少麻烦。但如果我需要iPhone和iPad的不同布局呢?你能做到这一点吗?不,对不起,我只需要在iPhone上尝试一下。我调用
tableView。在
视图中需要的布局将出现
。您还可以通过先调用
tableView.setNeedsLayout
来强制重画。iOS 9和iPhone。您找到解决方案了吗?