当我只指定一个约束时,Autolayout约束冲突

时间:2013-04-15 18:26:35

标签: ios autolayout autoresizingmask

我的控制器中有以下简单的测试代码:

- (void)loadView
{
    UIView *view = [UIView new];
    [self setView:view];

    UILabel *label = [UILabel new];
    [label setText:@"Hello World!"];

    [view addSubview:label];

    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-[label]"
        options:0 metrics:nil views:NSDictionaryOfVariableBindings(label)]];
} 

代码失败,出现以下异常,我无法弄清楚原因。任何帮助将不胜感激:

2013-04-15 14:15:47.880 libmarkup-test[1072:c07] 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) 
(
    "<NSLayoutConstraint:0x753eb60 H:|-(NSSpace(20))-[UILabel:0x7536b60]   (Names: '|':UIView:0x75376a0 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x712a2c0 h=--& v=--& UILabel:0x7536b60.midX ==>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x753eb60 H:|-(NSSpace(20))-[UILabel:0x7536b60]   (Names: '|':UIView:0x75376a0 )>

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.

“无法同时满足约束”的消息特别令人困惑,因为据我所知,我只是指定了一个约束。

2 个答案:

答案 0 :(得分:7)

看起来您忘了在UILabel上设置translatesAutoresizingMaskIntoConstraints。默认情况下,它将为YES。因此,该标签上的自动调整掩码将转换为其他约束,然后与您指定的约束冲突。

添加此项应解决约束问题:

label.translatesAutoresizingMaskIntoConstraints = NO;

您应该考虑对该标签的垂直约束。

答案 1 :(得分:-1)

请调整约束优先级(默认为1000)和拥抱优先级(默认为250)

相关问题