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

时间:2013-11-27 12:52:13

标签: ios objective-c constraints

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

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

[[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)]>"
)
     

将尝试通过违反约束< NSLayoutConstraint:0x165c0280 V:[UIView:0x165bda30]-(44)-| (Names: '|':UIView:0x166dd460 )>

来恢复      

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

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

这让我疯了!

1 个答案:

答案 0 :(得分:3)

您需要使用参数setTranslatesAutoresizingMaskIntoConstraints:在视图上调用NO。这样可以防止自动添加您在日志中看到的NSAutoresizingMaskLayoutConstraint(因此只会应用您的显式约束)。