2013-11-27 76 views
1

我有我的应用程序中的这个TabBarController,我已经在TabBar的顶部添加了一个UIView。我这样做是因为此视图显示了我想在每个视图中显示的持久数据。 我使用initWithFrame:对此进行了初始化,它正是我想要的地方。iOS以编程方式添加约束导致错误

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

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

这样一来,我期望MyView的总会从屏幕底部的44分间隔开,但是它不会发生。

调试器显示:

无法同时满足约束。

以下列表中的至少一个约束可能是您不想要的约束之一。试试这个:(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)]>" 
) 

将尝试打破约束上objc_exception_throw < NSLayoutConstraint:0x165c0280 V:[UIView:0x165bda30]-(44)-| (Names: '|':UIView:0x166dd460)>

歇赶追这在调试器中。 列出的UIView上的UIConstraintBasedLayoutDebugging类中的方法也可能有所帮助。

此错误仅在状态栏扩展时才会显示。没有其他限制以编程方式添加,并且此类的Interface Builder的VC为空。一切都以编程方式添加。

这让我疯狂!

回答

3

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

+0

我这样做了,但是这个视图根本不会显示。但是当你说“只有明确的限制”时,我才意识到,那么我也应该指定高度,宽度和原点。现在它按预期工作!谢谢。 – Guilherme

相关问题