Autolayout,如何解决这些约束错误

Posted

技术标签:

【中文标题】Autolayout,如何解决这些约束错误【英文标题】:Autolayout, how to solve these constraint errors 【发布时间】:2015-05-01 11:00:19 【问题描述】:

我在我的简单 UITableViewCell-Layout 中尝试了很多来解决自动布局约束错误,但现在卡住了。 TableView 的渲染效果符合预期,但警告很烦人,即使它看起来不错,我也不喜欢它运行有错误的布局。

我逐步删除了标签,以查看约束错误是否会消失。只有左侧的图像和图像右侧的最顶部标签在没有约束错误的情况下播放得很好。但至少我添加了第二个标签并将其与“刚刚”标签相同的位置,错误再次发生。

下面我将列出约束,然后是来自控制台的错误消息:

约束错误列出以下元素:

(
    "<NSLayoutConstraint:0x7fe004aa9010 V:|-(15)-[UILabel:0x7fe004aa83d0'Sunday, March 29, 2015 at...']   (Names: '|':UITableViewCellContentView:0x7fe004aa7bc0 )>",
    "<NSLayoutConstraint:0x7fe004aa9150 V:[UILabel:0x7fe004aa83d0'Sunday, March 29, 2015 at...']-(5)-[UILabel:0x7fe004aa8090'Name']>",
    "<NSLayoutConstraint:0x7fe004aa9240 V:[UILabel:0x7fe004aa8090'Name']-(5)-[UILabel:0x7fe004aa8920'lorem ipsum blaa foo bar']>",
    "<NSLayoutConstraint:0x7fe004aa92e0 V:[UILabel:0x7fe004aa8920'lorem ipsum blaa foo bar']-(33)-|   (Names: '|':UITableViewCellContentView:0x7fe004aa7bc0 )>",
    "<NSLayoutConstraint:0x7fe004ab09c0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7fe004aa7bc0(0)]>"
)

在我看来,没有双重约束,每个约束都有自己的含义。谁能给我解释一下?

【问题讨论】:

【参考方案1】:

从错误输出来看,似乎在某些时候(可能在计算正确高度之前)您的单元格的高度为 0

"<NSLayoutConstraint:0x7fe004ab09c0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7fe004aa7bc0(0)]>"

由于您的布局元素之间有一些正的垂直偏移量(例如标签的 15 顶部偏移量等),因此无法满足布局,因为这意味着某些视图必须具有负高度,这不是可能。

由于您的布局看起来不错,我的建议是将最后一个约束(从最后一个标签到容器视图的 33 底部偏移)的优先级设置为较低的优先级 (999)。这应该可以解决您的警告。

要真正找到为什么您的单元格在某个点的高度为 0,您必须查看如何计算单元格的高度(可能是自动调整大小)。如果您可以在那里发布您正在使用的代码,我可以尝试进一步帮助您。

让我知道进展如何。祝你好运!

【讨论】:

我按照您的建议将 33-bottom-constraint 的优先级更改为较低的值 (900)。这会将警告从 UIView-Encapsulated-Layout-Height 更改为 UIView-Encapsulated-Layout-Width: "<0x7faa21c5a710 h:> 【参考方案2】:

你的约束声明

V 用于vertical spaceH 用于Horizontal Space

    label1到顶部的垂直空间是15label1label2 的垂直空间是5label2label3 的垂直空间是5 'label3' 到底部的垂直间距是 33 请参考Auto-layout: What creates constraints named UIView-Encapsulated-Layout-Width & Height?

我只是发布了一张图片...我认为问题出在您的第一个标签上,即“刚刚”...尝试检查是否有任何警告出现...

如果您仍然遇到问题,则只需删除底部约束并将高度约束添加到 label3。

【讨论】:

非常感谢您的回答,但这并不能解决这个问题。我还为标签 3 添加了高度约束,但约束错误仍然存​​在。 完全正确。警告还是来了。 添加高度约束的时候,我也去掉了底部约束。 那么我认为问题出在第 5 个错误上......只需检查链接并检查该答案以及下面的答案......它真的可以帮助你 我完全从头开始重建它,就像你在“视频”中所做的那样,它起作用了:github.com/itinance/UITableViewAutoHeight 所以现在我必须调查为什么它在我现有的项目中不起作用。【参考方案3】:

终于明白了。约束是正确的。但是在我的 UITableViewCell-Subclass 中,我以这种方式覆盖了 layoutSubViews:

- (void)layoutSubviews

    [super layoutSubviews];
    [self.contentView setNeedsLayout];
    [self.contentView layoutIfNeeded];

    self.textData.preferredMaxLayoutWidth = CGRectGetWidth(self.textData.frame);

删除该代码修复了约束警告。另外,第一次显示表格时出现的闪烁效果也消失了:)

感谢您的所有提示和帮助!

【讨论】:

以上是关于Autolayout,如何解决这些约束错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Autolayout 在我的 UIScrollview 上设置约束?

Autolayout基础讲解

iOS - AutoLayout'无法同时满足约束'

UITableViewCell 中的多行 UILabel 在 iOS8 中使用 autoLayout 给出错误的高度

如何将 AutoLayout 约束的常量设置为超级视图的百分比?

AutoLayout 约束动画从错误的点缩放