自动布局约束错误

Posted

技术标签:

【中文标题】自动布局约束错误【英文标题】:Autolayout contraint error 【发布时间】:2014-07-31 04:09:30 【问题描述】:

所以这个自动布局错误。我知道它为什么在那里,但我不知道如何解决它。与错误一样,它显然无法解决约束。 在纵向模式下,所有 47 集都会列出并且可以滚动到。但是在横向模式下它不能,这很明显,因为桌子的高度没有改变,它仍然在那里但不能滚动到它。

这就是我的设置方式。

视图控制器有两个视图,作为占位符,上部用于 iAd,下部用于保存表格视图。想法在这背后。如果未加载广告,我会将 View 的高度设置为零,这会保留 iADBanner。这样表视图就占据了所有空间。 (从 Ray Wenderlich 的应用程序中得到了这个想法。)我最初在自动布局方面苦苦挣扎,但我做对了,这样当 sim 进入纵向模式时,视图占据了所有宽度。但不知何故,我无法修复包含 tableView 的视图高度。 下面是约束的截图。

我尽量做到描述性强。但我寻找的不仅仅是答案。我想完全了解这一点,这样我将来很可能不会有问题。我已经完成了 raywenderlich 教程。因此,任何其他指针都会非常感谢您的回答。

2014-07-30 21:40:37.326 Test[85608:60b] 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:0xa5afbc0 UIView:0xa69b7d0.width == 0.682303*UIView:0xa69b830.height>",
    "<NSLayoutConstraint:0xa5afc80 V:|-(50)-[UIView:0xa69b830]   (Names: '|':UIView:0xa69b7d0 )>",
    "<NSLayoutConstraint:0xa5afdc0 V:[UIView:0xa69b830]-(0)-[_UILayoutGuide:0xa5a8410]>",
    "<_UILayoutSupportConstraint:0xa5a7d20 V:[_UILayoutGuide:0xa5a8410(0)]>",
    "<_UILayoutSupportConstraint:0xa5af490 _UILayoutGuide:0xa5a8410.bottom == UIView:0xa69b7d0.bottom>",
    "<NSAutoresizingMaskLayoutConstraint:0xa792d10 h=--& v=--& H:[UIView:0xa69b7d0(480)]>",
    "<NSAutoresizingMaskLayoutConstraint:0xa792dd0 h=--& v=--& V:[UIView:0xa69b7d0(271)]>" )

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0xa5afdc0 V:[UIView:0xa69b830]-(0)-[_UILayoutGuide:0xa5a8410]>

Break on objc_exception_throw to catch this in the debugger. The
methods in the UIConstraintBasedLayoutDebugging category on UIView
listed in <UIKit/UIView.h> may also be helpful.

【问题讨论】:

很难说,但看起来您正在以编程方式添加一些视图/约束?我这么说是因为你有一对NSAutoresizingMaskLayoutConstraints。当您在 Interface Builder 中添加约束时,这些默认情况下被禁用。如果这是真的,您可以尝试在您添加的视图上将translatesAutoresizingMaskIntoConstraints 属性设置为NO 不,@daltonclay*** 我没有以编程方式这样做 【参考方案1】:

错误日志中的约束列表是理解此类问题的关键。您要做的是仔细查看它以关联哪些行引用您的代码/ui 构建器中的哪些约束,以及哪些十六进制地址引用哪个视图。

    V:[UIView:0xa69b830]-(0)-[_UILayoutGuide:0xa5a8410] 是将 UIView 的底部设置为布局指南的约束,因此很可能这是屏幕截图“垂直空间 - 底部布局指南 - TableVi ...”中的最后一个约束(大概是 TableViewHolder 被截断)。这意味着UIView:0xa69b830 是您的TableViewHolderV:|-(50)-[UIView:0xa69b830] (Names: '|':UIView:0xa69b7d0 ) 是约束 TableViewHolder 的 top 距离其父视图 50px,它必须是 UIView:0xa69b7d0UIView:0xa69b7d0.width == 0.682303*UIView:0xa69b830.height 看起来像是父视图宽度和 TableViewHolder 高度之间的纵横比约束。 h=--&amp; v=--&amp; H:[UIView:0xa69b7d0(480)]h=--&amp; v=--&amp; V:[UIView:0xa69b7d0(271)] 是从其 autoresizingMask 派生的超级视图的约束,其中宽度 = 480 像素,高度 = 271 像素,并且它们的顶部/左侧/宽度/高度是固定的(基于 @ 987654330@)。这是视图控制器根视图的标准设置——它的尺寸由视图控制器手动管理以填充屏幕。

因此,一旦您拥有了所有这些,您就会看到问题所在:超级视图的尺寸固定为 480x271。同时,TableViewHolder 的高度由多个相互冲突的约束决定:

#1 和#2 正在尝试垂直拉伸它以在其顶部以 50 像素的边距填充其超级视图,因此高度 = 271-50 = 221 像素。 #3 正在尝试将高度设置为父视图宽度的比率:height = 480/0.6823 = 703.5px 221 != 730.5!

有些东西必须放弃,而操作系统恰好选择了 #1,因此 TableViewHolder 的底部超出了布局指南的底部,使其超出了屏幕边缘并且无法访问。

您的修复可能会涉及摆脱该纵横比限制,但一旦您修复它,可能会出现其他问题。祝你好运!

【讨论】:

@Danial :非常感谢。我学到了几件事。这里首先永远不会在那个小盒子 pf 调试器中读取错误。你永远不会知道这是什么问题。其次,当然是您如何解释约束。我希望他们在教程/书籍中清楚地解释这一点。您是否推荐任何书或链接以使我更好地理解 Autolayout。是的,一旦我删除了该比率约束,就可以肯定。有效。 :) 感谢您指出我的问题。 @Alix,我没有要推荐的书,但我强烈推荐观看 Apple 的 WWDC videos — 只需搜索“自动布局”即可。有许多他们没有在其他地方记录过的技术。 观看这些视频。谢谢推荐。

以上是关于自动布局约束错误的主要内容,如果未能解决你的问题,请参考以下文章

自动布局约束错误

在日志中定位自动布局约束错误

为啥我会在不应为 size 类安装的约束上收到自动布局错误?

错误:线程 1:“无法设置未准备好约束的视图层次结构的布局。”使用自动布局时

自动旋转时自动布局约束更新

自动布局约束不起作用