Autolayout constraints warning “Will attempt to recover by breaking constraint”

一个人想着一个人 提交于 2019-11-30 14:06:39

问题


I am setting some specifics constraints for iPhone 4 when the app is ran on this device. Everything look great in terms of alignment and everything.

But, I am getting an error for all my constraints that is trying to recover them by breaking the constraints.

This method gets call in my viewDidLoad when it detects if its an iPhone 4

- (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];

}

Error!

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 )>

Please let me know if you guys need more information..


回答1:


These three constraints:

"<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 )>",

dictate that the superview be 50 + 210 + 20 == 280 points wide.

These three constraints:

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

dictate that the same superview be 78 + 173 + 20 == 271 points wide.

Obviously, those can't both be true at the same time. You need to decide what you really want to happen here. We can't read your mind and neither can UIKit.

Usually, you don't set a width constraint on a button; you let it use its intrinsic size with appropriate priorities for content hugging and compression resistance. Also, you may not wish to set hard spacing on either side of the button. Either let that spacing vary without constraint so the button can be its intrinsic size, lower the priority of that constraint so it's optional, or make an inequality so you have a minimum spacing but not an exact spacing.




回答2:


You are constraining your views too much. You must always leave for example one of leftmargin, width and rightmargin flexible, and let the autolayout engine stretch that one.

A single dash without any number means default distance, which is 20 pixels. So, if you remove your trailing constraints on

@"H:|-78-[myNext(==173)]-|"
@"H:|-11.5-[myBtn(==54)]-|"

and change them to

@"H:|-78-[myNext(==173)]"
@"H:|-11.5-[myBtn(==54)]"

the layout engine will then stretch the rightmargin of the button to make it fit the containing view. There are of course other ways of loosening up these constraints, all depending on your design goals.

Personally, I never use the standard API:s for autolayout anymore. I use the library PureLayout, which abstracts autolayout wonderfully!



来源:https://stackoverflow.com/questions/25107762/autolayout-constraints-warning-will-attempt-to-recover-by-breaking-constraint

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!