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)]>" )
将尝试通过打破约束
< NSLayoutConstraint:0x165c0280 V:[UIView:0x165bda30]-(44)-| (Names: '|':UIView:0x166dd460 )>
来恢复中断 objc_exception_throw 以在调试器中捕获它。 中列出的 UIView 上的 UIConstraintBasedLayoutDebugging 类别中的方法也可能会有所帮助。
此错误仅在状态栏展开时显示。没有以编程方式添加其他约束,并且此类的 Interface Builder 的 VC 是空的。一切都是以编程方式添加的。
这让我发疯了!
【问题讨论】:
【参考方案1】:您需要在带有NO
参数的视图上调用setTranslatesAutoresizingMaskIntoConstraints:
。这将阻止自动添加您在日志中看到的NSAutoresizingMaskLayoutConstraint
s(因此只有您的显式约束将适用)。
【讨论】:
我这样做了,但视图根本不会显示。但是当你说“只有明确的约束”时,我意识到我还应该指定高度、宽度和原点。现在它按预期工作!谢谢。以上是关于iOS以编程方式添加约束导致错误的主要内容,如果未能解决你的问题,请参考以下文章