在调用reloadData之前,Autolayout会错误地调整UITableViewCells的大小

时间:2014-09-21 20:04:10

标签: ios uitableview autolayout ios8

我有一个tableview单元格,其视图是从一个笔尖加载的,其子视图是使用AutoLayout约束的。我正在使用iOS 8的自定义单元格功能。首次显示时,单元格如下所示:

Too much margin.

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

Just right.

在第二个布局通过之前,好像单元格子视图的大小不正确。我怎么能绕过这个?我发现有些帖子建议在setPreferredMaxLayoutWidth中设置layoutSubviews,如下:

-(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。这实际上是我得到的,因为空间更大。

但是,如果我将关系设置为==,我会得到一个不同的视觉错误,其中红色标签的大小不正确,因为它包含的文本数量: enter image description here


编辑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>

UILabel所指的是较长的绿色标签。看起来它无法协调前导和尾随约束与单元格具有的任何宽度,就像单元格总体上小于12个点一样。然而,记录宽度似乎总是导致320。

3 个答案:

答案 0 :(得分:1)

只是补充一下,因为大多数人都提出了对我不起作用的东西,这就是我修复它的方法(适用于iOS 8)。我将XIB用于细胞,但这应该是通用的。

首先,UILabel上存在一个错误,其中“ - (void)layoutSubviews”未被调用,因此您无法真正让iOS 7.0解决方案适用于iOS 8.因此,我使用自动单元格大小调整来实现iOS 8。

然而,上述错误正在发生。我不得不重新加载表视图以确保单元格正确。如果你看一下那里的教程和例子,那里有很多工作正常,而其他人抱怨有bug。我一直在寻找错误示例和正确示例之间的共同点,而错误是: size-classes。

而不是使用“compact-width”和“any-height”使用“any-any”。使用“any-any”修复所有问题,一切都按预期工作。听起来很荒谬,但试试吧!

答案 1 :(得分:0)

可能是布局没问题,但是细胞高度计算?我会仔细检查您的estimatedHeightForRowAtIndexPath或heightForRowAtIndexPath。

答案 2 :(得分:0)

使用Xcode 6的视图调试工具查看自动布局约束是否存在问题。如果您发现情况并非如此,那么@niklassaers可能是对的。

相关问题