iOS以编程方式添加约束导致错误

Posted

技术标签:

【中文标题】iOS以编程方式添加约束导致错误【英文标题】:iOS programmatically adding constraints resulting in error 【发布时间】:2013-11-27 12:52:13 【问题描述】:

我的应用程序中有这个 TabBarController,我在 TabBar 的最顶部添加了一个 UIView。我这样做是因为这个视图显示了我想在每个视图中显示的持久数据。 我使用initWithFrame: 对其进行了初始化,这正是我想要的位置。

今天我注意到当状态栏的高度增加时(在通话或个人热点期间),该视图会向底部移动。我试图通过添加一个约束来解决这个问题:

[[self view] addConstraints:[NSLayoutConstraint 
                     constraintsWithVisualFormat:@"V:[_myView]-(44)-|"
                                         options:NSLayoutFormatDirectionLeadingToTrailing
                                         metrics:nil
                                           views:NSDictionaryOfVariableBindings(_myView)]];

这样,我希望 myView 始终与屏幕底部相距 44 pts,但它不会发生。

调试器显示:

无法同时满足约束。

可能以下列表中的至少一个约束是您不想要的。试试这个:(1)查看每个约束并尝试找出您不期望的; (2) 找到添加了一个或多个不需要的约束的代码并修复它。 (注意:如果您看到不理解的NSAutoresizingMaskLayoutConstraints,请参阅UIView 属性translatesAutoresizingMaskIntoConstraints 的文档)

(
    "< NSLayoutConstraint:0x165c0280 V:[UIView:0x165bda30]-(44)-|   (Names: '|':UIView:0x166dd460 )>",
    "< NSAutoresizingMaskLayoutConstraint:0x165a7ce0 h=--& v=--& UIView:0x165bda30.midY == + 507>",
    "< NSAutoresizingMaskLayoutConstraint:0x165c50c0 h=--& v=--& V:[UIView:0x165bda30(34)]>",
    "< NSAutoresizingMaskLayoutConstraint:0x165c3a90 h=-&- v=-&- UIView:0x166dd460.height == UIWindow:0x1668f870.height - 20>",
    "< NSAutoresizingMaskLayoutConstraint:0x165a8070 h=--- v=--- V:[UIWindow:0x1668f870(568)]>"
)

将尝试通过打破约束&lt; NSLayoutConstraint:0x165c0280 V:[UIView:0x165bda30]-(44)-| (Names: '|':UIView:0x166dd460 )&gt;来恢复

中断 objc_exception_throw 以在调试器中捕获它。 中列出的 UIView 上的 UIConstraintBasedLayoutDebugging 类别中的方法也可能会有所帮助。

此错误仅在状态栏展开时显示。没有以编程方式添加其他约束,并且此类的 Interface Builder 的 VC 是空的。一切都是以编程方式添加的。

这让我发疯了!

【问题讨论】:

【参考方案1】:

您需要在带有NO 参数的视图上调用setTranslatesAutoresizingMaskIntoConstraints:。这将阻止自动添加您在日志中看到的NSAutoresizingMaskLayoutConstraints(因此只有您的显式约束将适用)。

【讨论】:

我这样做了,但视图根本不会显示。但是当你说“只有明确的约束”时,我意识到我还应该指定高度、宽度和原点。现在它按预期工作!谢谢。

以上是关于iOS以编程方式添加约束导致错误的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式添加约束会导致崩溃

以编程方式向 Swift 中的视图添加约束时出错

以编程方式设置约束导致 Swift 中的冲突

如何在 ios 中以编程方式添加约束

iOS:以编程方式添加约束获取视图高度作为唯一指标

以编程方式添加前导/顶部约束