Autolayout约束警告"将尝试通过破坏约束来恢复"(可能的逻辑问题)

val*_*u17 9 objective-c ios autolayout nslayoutconstraint

我在这个设备上运行应用程序时为iPhone 4设置了一些细节限制.在对齐和一切方面,一切看起来都很棒.

但是,我正在试图通过打破约束来试图恢复它们.

当它检测到它是iPhone 4时,此方法在我的viewDidLoad中调用

- (void) addConstraints {

    // removing automatic system constraints
    [self.view removeConstraints:self.view.constraints];
    [self.view setTranslatesAutoresizingMaskIntoConstraints:NO];


    NSDictionary *views = NSDictionaryOfVariableBindings(appBackground, myCustomer, myItemDetails, myItemQuantity, myItemPrice, myNext, myBtn); // UIImageView, UITextField, UIButton

    for (UIView *view in [views allValues]) {
        view.translatesAutoresizingMaskIntoConstraints = NO;
    }

    NSDictionary *metrics = @{@"width": @210.0, @"height": @42.0, @"verticalSpacing": @34};

    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[appBackground]|"
                                                                   options:0
                                                                   metrics:nil
                                                                     views:views];

    constraints = [constraints arrayByAddingObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[appBackground]|"
                                                                   options:0
                                                                   metrics:nil
                                                                     views:views]];

    constraints = [constraints arrayByAddingObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(85)-[myCustomer(==height)]-(verticalSpacing)-[myItemDetails(==height)]-(verticalSpacing)-[myItemQuantity(==height)]-(verticalSpacing)-[myItemPrice(==height)]-(18)-[myNext(==35)]-(71.5)-[myBtn(==50)]-(7.5)-|"
                                                                    options:0
                                                                    metrics:metrics
                                                                      views:views]];

    constraints = [constraints arrayByAddingObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-50-[myCustomer(==width)]-|"
                                                                                                     options:0
                                                                                                     metrics:metrics
                                                                                                       views:views]];

    constraints = [constraints arrayByAddingObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-50-[myItemDetails(==width)]-|"
                                                                                                     options:0
                                                                                                     metrics:metrics
                                                                                                       views:views]];

    constraints = [constraints arrayByAddingObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-50-[myItemQuantity(==width)]-|"
                                                                                                     options:0
                                                                                                     metrics:metrics
                                                                                                       views:views]];

    constraints = [constraints arrayByAddingObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-50-[myItemPrice(==width)]-|"
                                                                                                     options:0
                                                                                                     metrics:metrics
                                                                                                       views:views]];

    constraints = [constraints arrayByAddingObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-78-[myNext(==173)]-|"
                                                                                                     options:0
                                                                                                     metrics:metrics
                                                                                                       views:views]];

    constraints = [constraints arrayByAddingObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-11.5-[myBtn(==54)]-|"
                                                                                                     options:0
                                                                                                     metrics:metrics
                                                                                                       views:views]];

    [self.view addConstraints:constraints];

}
Run Code Online (Sandbox Code Playgroud)

错误!

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:0xb8282f0 H:|-(50)-[UITextField:0xb823fc0]   (Names: '|':UIView:0xb82f360 )>",
    "<NSLayoutConstraint:0xb828320 H:[UITextField:0xb823fc0(210)]>",
    "<NSLayoutConstraint:0xb82be10 H:[UITextField:0xb823fc0]-(NSSpace(20))-|   (Names: '|':UIView:0xb82f360 )>",
    "<NSLayoutConstraint:0xb82d3d0 H:|-(78)-[UIButton:0xb82ad50]   (Names: '|':UIView:0xb82f360 )>",
    "<NSLayoutConstraint:0xb82d420 H:[UIButton:0xb82ad50(173)]>",
    "<NSLayoutConstraint:0xb82d450 H:[UIButton:0xb82ad50]-(NSSpace(20))-|   (Names: '|':UIView:0xb82f360 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0xb82d450 H:[UIButton:0xb82ad50]-(NSSpace(20))-|   (Names: '|':UIView:0xb82f360 )>

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.
2014-08-03 14:03:29.239 iReceipt[2886:607] 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:0xb8282f0 H:|-(50)-[UITextField:0xb823fc0]   (Names: '|':UIView:0xb82f360 )>",
    "<NSLayoutConstraint:0xb828320 H:[UITextField:0xb823fc0(210)]>",
    "<NSLayoutConstraint:0xb82be10 H:[UITextField:0xb823fc0]-(NSSpace(20))-|   (Names: '|':UIView:0xb82f360 )>",
    "<NSLayoutConstraint:0xb82d480 H:|-(11.5)-[UIButton:0xb820120]   (Names: '|':UIView:0xb82f360 )>",
    "<NSLayoutConstraint:0xb82e390 H:[UIButton:0xb820120(54)]>",
    "<NSLayoutConstraint:0xb82e3c0 H:[UIButton:0xb820120]-(NSSpace(20))-|   (Names: '|':UIView:0xb82f360 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0xb82e3c0 H:[UIButton:0xb820120]-(NSSpace(20))-|   (Names: '|':UIView:0xb82f360 )>
Run Code Online (Sandbox Code Playgroud)

如果您需要更多信息,请告诉我.

Ken*_*ses 18

这三个限制:

"<NSLayoutConstraint:0xb8282f0 H:|-(50)-[UITextField:0xb823fc0]   (Names: '|':UIView:0xb82f360 )>",
"<NSLayoutConstraint:0xb828320 H:[UITextField:0xb823fc0(210)]>",
"<NSLayoutConstraint:0xb82be10 H:[UITextField:0xb823fc0]-(NSSpace(20))-|   (Names: '|':UIView:0xb82f360 )>",
Run Code Online (Sandbox Code Playgroud)

要求超级视图为50 + 210 + 20 == 280点宽.

这三个限制:

"<NSLayoutConstraint:0xb82d3d0 H:|-(78)-[UIButton:0xb82ad50]   (Names: '|':UIView:0xb82f360 )>",
"<NSLayoutConstraint:0xb82d420 H:[UIButton:0xb82ad50(173)]>",
"<NSLayoutConstraint:0xb82d450 H:[UIButton:0xb82ad50]-(NSSpace(20))-|   (Names: '|':UIView:0xb82f360 )>"
Run Code Online (Sandbox Code Playgroud)

要求相同的超级视图为78 + 173 + 20 == 271点宽.

显然,那些不可能同时是真实的.你需要决定你真正想要在这里发生什么.我们无法读懂你的想法,UIKit也无法读懂.

通常,您不要在按钮上设置宽度约束; 你让它使用它的内在大小和适当的内容拥抱和抗压性优先级.此外,您可能不希望在按钮的任一侧设置硬间距.让这个间距在没有约束的情况下变化,因此按钮可以是其内在大小,降低该约束的优先级,因此它是可选的,或者产生不等式,因此您具有最小间距但不是精确间距.