Autolayout约束错误

时间:2014-07-31 04:09:31

标签: ios ios7 autolayout

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

Screen 1

screen 2

所以这就是我的设置方式。

View hierarchy

其中视图控制器有两个视图,它作为占位符,上面是iAds,下面是保持表视图。想法就在这背后。如果未加载广告,我会将View的高度设置为零,以保存iADBanner。因此Table视图占用了所有空间。 (从Ray Wenderlich的应用程序中得到这个想法让我高兴。)我最初在自动布局上苦苦挣扎,但是我做对了,所以当sim进入肖像模式时,视图占据了所有宽度。但不知何故,我无法修复持有tableView的视图高度。 以下是约束的屏幕截图。

constraint 1 of 2 Constraint 2 of 2

我试着尽可能地描述。但我正在寻找的不仅仅是回答。我想完全了解这一点,以便将来很可能不会有问题。我已经完成了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.

1 个答案:

答案 0 :(得分:1)

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

  1. V:[UIView:0xa69b830]-(0)-[_UILayoutGuide:0xa5a8410]是一个约束,将UIView的底部设置为布局指南,因此很可能是屏幕截图中的最后一个约束“Vertical Space - Bottom layout guide - TableVi ...”(可能是截断的TableViewHolder) )。这意味着UIView:0xa69b830是您的TableViewHolder
  2. V:|-(50)-[UIView:0xa69b830] (Names: '|':UIView:0xa69b7d0 )是将TableViewHolder 50px的 top 与其superview绑定的约束,该视图必须为UIView:0xa69b7d0
  3. UIView:0xa69b7d0.width == 0.682303*UIView:0xa69b830.height看起来像是超视图宽度和TableViewHolder高度之间的宽高比约束。
  4. h=--& v=--& H:[UIView:0xa69b7d0(480)]h=--& v=--& V:[UIView:0xa69b7d0(271)]是超级视图的约束,它来自 autoresizingMask ,其中width = 480px,height = 271px,以及它们的上/左/宽度/高度是固定的(基于h=--& v=--&)。这是视图控制器根视图的标准设置 - 它的尺寸由视图控制器手动管理以填充屏幕。
  5. 所以,一旦掌握了所有这些,您就可以看到问题所在:超视图的固定尺寸为480x271。同时,TableViewHolder的高度由多个冲突约束决定:

    • #1和#2试图垂直拉伸以填充其超视图,顶部有50px的边距,因此高度= 271-50 = 221px。
    • #3试图将高度设置为superview宽度的比例:height = 480 / 0.6823 = 703.5px
    • 221!= 730.5!

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

    您的修复可能会涉及删除该宽高比限制,但一旦您解决了这个问题,可能会出现其他问题。祝你好运!