我在IOS8上遇到自动布局问题,我可以重新创建的最简单的情况是一个简单的tableView。我设置了一个静态单元格,然后只需添加一个标签。
我的目标是让标签在很大程度上填满空间,所以我对标签有三个限制......
这一切都非常好并且完美无缺,没有出现重大问题或警告(它确实警告零高度,但我认为这不是一个很大的问题)
现在......如果我添加一个披露指标,它就会崩溃。它看起来还不错,但我得到以下内容:
2014-10-30 15:51:46.358 ContraintIssue[25572:1586028] Unable to simultaneously satisfy constraints.
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:0x7fd3f3d23390 UITableViewCellContentView:0x7fd3f3d226f0.trailingMargin == UILabel:0x7fd3f3d227e0'Label'.trailing + 30>",
"<NSLayoutConstraint:0x7fd3f3d235f0 UILabel:0x7fd3f3d227e0'Label'.leading == UITableViewCellContentView:0x7fd3f3d226f0.leadingMargin + 30>",
"<NSLayoutConstraint:0x7fd3f53b73b0 'fittingSizeHTarget' H:[UITableViewCellContentView:0x7fd3f3d226f0(38)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7fd3f3d23390 UITableViewCellContentView:0x7fd3f3d226f0.trailingMargin == UILabel:0x7fd3f3d227e0'Label'.trailing + 30>
我不明白为什么添加指标会导致这样的问题,这与数字的规模无关,我已经进行了相当多的实验。
有什么想法吗?
真实世界示例具有标签(标签)的单元格,然后是包含可以通过遵循公开内容设置的值的另一标签或文本视图。所以第一个标签是固定大小,第二个标签理想情况下需要是最大标签,但如果需要则截断文本。
(请参阅添加联系人的“铃声”或“振动设置”以获取我想要实现的示例)
非常感谢,
利。
答案 0 :(得分:47)
我遇到了同样的问题。我想在左侧布置一个带有标签的图像视图,该标签填充图像视图和超视图右边(或尾随)边界之间的空间(这是单元格的内容视图) 。附件视图也设置为披露指标。
在您的情况下,所有基于H的冲突约束和我在fittingSizeHTarget
的日志中找到的约束冲突。我没有发现这意味着什么,也没有发现它的来源,但我在这里发现了你的帖子。
以下为我做了诀窍:
降低标签的追踪到超级视图约束的优先级。 (我选择了990)。
我认为布局系统(公开指示器可见)因为什么原因不能满足所有约束,所以它打破了一个。但是如果降低优先级,它仍会尝试满足约束条件,但不会因冲突约束具有更高优先级而中断它。
希望这也解决了你的问题。
答案 1 :(得分:1)
请注意Stephen在 upvoted答案的评论部分中所说的内容。推荐的答案是有点正确,但重要的是要理解为什么它只应该在某些情况下使用。
优先级通常用于上下文,其中元素A具有约束高度等于或小于/大于300,而元素B有一个表示高度等于或小于/大于500.然后自动布局可满足两个条件基于他们的优先事项。
在这个特定的例子中,两个约束都被设置为特定值,并且降低优先级本质上告诉忽略该约束,如果它不可能满足(没有“部分忽略它”)。 但是 UILabel有一个例外 - 默认的UILabel行为是调整自身大小以适应内容,除非它受到额外边距的约束(自动调整约束隐藏在fittingSizeHTarget名称下),并且此行为有时会显示错误警告。实际上,此约束将在运行时中被忽略,但在内部禁用之前,它将发出警告。因此,即使我们通过降低其优先级(我们将优先级设置为900)来忽略其中一个约束,但由于自动调整约束将在运行时被忽略,因此我们将应用并满足900优先级。
答案 2 :(得分:1)
上面提到的Raimunda的答案解释了发生在fittingSizeHTarget日志来自的标签,按钮等上的固有大小。虽然您可以离开它并让系统处理它,但这是一个冒险的黑客,因为您依赖系统来打破不需要的约束...在将来的发行版中可能不会这样做。在某些情况下,如我最近处理的一个示例中所示,将尾随约束的优先级降低到外部安全区域并不能防止标签超车(但是确实解决了日志警告大声笑)。>
对于此类内容问题,请使用 Content Hugging Priority 和 Content Compression Resistance Priority 值。例如,如果您知道标签将要增加垂直高度但限制为水平值,则使垂直内容拥抱优先级(内容拥抱=阻止放大的视图)低于水平。
抗压性与此相反。
然后将外部拖尾约束设置为大于或等于,您就可以开始了。
在下面的堆栈视图中,标题为Fake 4的标签实际上已覆盖并希望变成两行。这就引起了涉及fittingSizeHTarget的冲突(固有内容大小希望保持在一行上并超出视图宽度)。这里的关键是将“水平压缩阻力”优先级降低到低于所有其他内容优先级。这使我可以降低> =约束在尾随值上的优先级,并且一切正常。
无论如何,微调这些东西很烦人,但是通常将答案/压缩值与某种形式的> = / <=结合使用。
希望这会有所帮助。