【问题标题】:Prevent Interface Builder from auto creating Constraints?防止 Interface Builder 自动创建约束?
【发布时间】:2015-08-12 15:09:03
【问题描述】:

我创建了一个演示项目here。我有一个视图,我在 .xib 文件中创建了一个 ScrollView。在界面生成器中,我没有设置任何约束。在我的 viewDidLoad 方法中,我使用SnapKit 设置约束:

scrollView.snp_makeConstraints { (make) -> Void in
  make.edges.equalTo(self.view)
}

当我运行代码时,我得到以下控制台输出:

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) 
(
    "<NSIBPrototypingLayoutConstraint:0x7b74e280 'IB auto generated at build time for view with fixed frame' V:|-(1)-[UIScrollView:0x7b74c430]   (Names: '|':UIView:0x7b74dd10 )>",
    "<<DeviceImagesTest.LayoutConstraint:0x7baa2760> <UIScrollView:0x7b6608d0>.top == <UIView:0x7b64d800>.top>"
)

Will attempt to recover by breaking constraint 
<NSIBPrototypingLayoutConstraint:0x7b74e280 'IB auto generated at build time for view with fixed frame' V:|-(1)-[UIScrollView:0x7b74c430]   (Names: '|':UIView:0x7b74dd10 )>

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.
2015-05-29 18:37:14.368 DeviceImagesTest[36462:607] 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) 
(
    "<NSIBPrototypingLayoutConstraint:0x7b74e080 'IB auto generated at build time for view with fixed frame' H:|-(0)-[UIScrollView:0x7b74c430](LTR)   (Names: '|':UIView:0x7b74dd10 )>",
    "<NSIBPrototypingLayoutConstraint:0x7b74e330 'IB auto generated at build time for view with fixed frame' H:[UIScrollView:0x7b74c430(600)]>",
    "<<DeviceImagesTest.LayoutConstraint:0x7baa7170> <UIScrollView:0x7baa7b30>.right == <UIView:0x7baa79a0>.right>",
    "<NSAutoresizingMaskLayoutConstraint:0x7baa4800 h=-&- v=-&- UIView:0x7b74dd10.width == UIViewControllerWrapperView:0x7ba9f060.width>",
    "<NSAutoresizingMaskLayoutConstraint:0x7baa5180 h=-&- v=-&- UIViewControllerWrapperView:0x7ba9f060.width == UINavigationTransitionView:0x7bc769b0.width>",
    "<NSAutoresizingMaskLayoutConstraint:0x7baa58e0 h=-&- v=-&- UINavigationTransitionView:0x7bc769b0.width == UILayoutContainerView:0x7bc75140.width>",
    "<NSAutoresizingMaskLayoutConstraint:0x7baa61a0 h=-&- v=-&- UILayoutContainerView:0x7bc75140.width == UIWindow:0x7bc71870.width>",
    "<NSAutoresizingMaskLayoutConstraint:0x7baa69a0 h=--- v=--- H:[UIWindow:0x7bc71870(320)]>"
)

Will attempt to recover by breaking constraint 
<<DeviceImagesTest.LayoutConstraint:0x7baa95b0> <UIScrollView:0x7baa9610>.right == <UIView:0x7baa96b0>.right>

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.
2015-05-29 18:37:14.496 DeviceImagesTest[36462:607] 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) 
(
    "<NSIBPrototypingLayoutConstraint:0x7b74e360 'IB auto generated at build time for view with fixed frame' V:[UIScrollView:0x7b74c430(600)]>",
    "<<DeviceImagesTest.LayoutConstraint:0x7bc77e40> <UIScrollView:0x7bc7f6a0>.top == <UIView:0x7bc52180>.top>",
    "<<DeviceImagesTest.LayoutConstraint:0x7bc49420> <UIScrollView:0x7bc74b00>.bottom == <UIView:0x7bc7b970>.bottom>",
    "<NSAutoresizingMaskLayoutConstraint:0x7baa4960 h=-&- v=-&- UIView:0x7b74dd10.height == UIViewControllerWrapperView:0x7ba9f060.height>",
    "<NSAutoresizingMaskLayoutConstraint:0x7baa51e0 h=-&- v=-&- UIViewControllerWrapperView:0x7ba9f060.height == UINavigationTransitionView:0x7bc769b0.height>",
    "<NSAutoresizingMaskLayoutConstraint:0x7baa5940 h=-&- v=-&- UINavigationTransitionView:0x7bc769b0.height == UILayoutContainerView:0x7bc75140.height>",
    "<NSAutoresizingMaskLayoutConstraint:0x7baa6200 h=-&- v=-&- UILayoutContainerView:0x7bc75140.height == UIWindow:0x7bc71870.height>",
    "<NSAutoresizingMaskLayoutConstraint:0x7baa69d0 h=--- v=--- V:[UIWindow:0x7bc71870(568)]>"
)

Will attempt to recover by breaking constraint 
<<DeviceImagesTest.LayoutConstraint:0x7bc84790> <UIScrollView:0x7bc848b0>.bottom == <UIView:0x7bc84860>.bottom>

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.

即使我没有设置任何约束,Interface Builder 似乎也在为我生成约束。这会导致与我在代码中设置的约束发生冲突。我也设置了setTranslatesAutoresizingMasks(false)

如何防止 Interface Builder 自动生成约束?

【问题讨论】:

  • 如果您在情节提要中设置 no 约束,那么在代码中,scrollview.setTranslatesAutoresizingMasksIntoConstraints(false)
  • 我使用的是界面生成器而不是 Storyboard,我使用的是 setTranslatesAutoresizingMasks(false)

标签: ios autolayout interface-builder nslayoutconstraint xcode-storyboard


【解决方案1】:

如果您对该列表中的 NSAutoresizingMaskLayoutConstraints 感到困惑,可能是因为您没有在该视图上调用 setTranslatesAutoresizingMasksIntoContraints(false)。 (不过,我的印象是 SnapKit 会为你做到这一点)。

如果您对 NSIBPrototypingLayoutConstraint 感到困惑,那是 Interface Builder 自动生成的约束。要摆脱它,请在 Interface Builder 中添加一些 Top、Bottom、Leading 和 Trailing 约束,并将它们设置为在构建时删除。有关详细信息,请查看http://travisjeffery.com/b/2013/11/preventing-ib-auto-generated-at-build-time-for-view-with-fixed-frame/

更新:网址已更改为http://travisjeffery.com/b/2013/11/preventing-ib-auto-generated-at-build-time-for-view-with-fixed-frame-when-using-auto-layout/

【讨论】:

    【解决方案2】:

    如何防止 Interface Builder 自动生成约束?

    最简单的方法:在项目导航器中选择笔尖或情节提要,进入文件检查器,取消选中“使用自动布局”。

    【讨论】:

    • 继续吧。我们只是在笔尖中打开自动布局行为,这正是您想要做的。您仍然可以在代码中使用它。试试看!
    • 不能那样工作。您可以查看我的示例,但我仍然收到警告。
    • 不,你说的是这些:NSAutoresizingMaskLayoutConstraint。那是因为你忘了setTranslatesAutoresizingMasksIntoContraints(false)。我说的是这些:NSIBPrototypingLayoutConstraint。这就是你问的。如果您在笔尖中关闭自动布局,则会阻止这些。
    • 我还是不明白。我的示例中有什么问题:github.com/confile/SnapKit-Test
    • 您正在使用第三方库 SnapKit。我不做那种事。那只是你和现实之间的另一层混乱。我向你保证,我所说的是真的;我一直这样做。
    猜你喜欢
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    相关资源
    最近更新 更多