简体   繁体   中英

ios6 autolayout constraints

I'm trying to figure out how to use constraints on a UIViewController (inside a UITabBarController which is inside a UINavigationController)... More than a thousand words, here's what I'm trying to do...

肖像Lanscape

Actually, the first one is 100px height no matter the orientation, the second is an Ad (so 50px in portrait and 32px in Landscape), and finally a tableView that will take the rest.

So far here is my code:

PMMainProfilHeader  *profilHeader = [[PMMainProfilHeader alloc] init];
    [self.view addSubview:profilHeader];
    [profilHeader release];

    UIView *adTest = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 50)];
    adTest.backgroundColor = [UIColor redColor];
    [self.view addSubview:adTest];
    [adTest release];

    _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    [self.view addSubview:_tableView];
    [_tableView release];

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[profilHeader]-0-|"
                                                                      options:0
                                                                      metrics:nil
                                                                        views:NSDictionaryOfVariableBindings(profilHeader)]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[adTest]-0-|"
                                                                      options:0
                                                                      metrics:nil
                                                                        views:NSDictionaryOfVariableBindings(adTest)]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[_tableView]-0-|"
                                                                      options:0
                                                                      metrics:nil
                                                                        views:NSDictionaryOfVariableBindings(_tableView)]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[profilHeader]-0-[adTest]-0-[_tableView]-0-|"
                                                                      options:0
                                                                      metrics:nil
                                                                        views:NSDictionaryOfVariableBindings(profilHeader, adTest, _tableView)]];

But of course it doesn't work... and I'm not able to tell why, when I resume debug a couple of time I get this block of comment from debugger :

2013-02-22 00:17:13.207 MyApplication[6822:907] 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:0x1d0b20d0 H:[UIView:0x1d0ae7e0]-(0)-|   (Names: '|':UIView:0x1c596de0 )>",
    "<NSLayoutConstraint:0x1d0b2090 H:|-(0)-[UIView:0x1d0ae7e0]   (Names: '|':UIView:0x1c596de0 )>",
    "<NSLayoutConstraint:0x1d0b2000 H:[PMMainProfilHeader:0x1d09f5b0]-(0)-|   (Names: '|':UIView:0x1c596de0 )>",
    "<NSLayoutConstraint:0x1d0b2320 H:|-(0)-[PMMainProfilHeader:0x1d09f5b0]   (Names: '|':UIView:0x1c596de0 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5dcb10 h=--& v=--& UIView:0x1d0ae7e0.midX ==>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5daf80 h=--& v=--& PMMainProfilHeader:0x1d09f5b0.midX == + 160>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x1d0b20d0 H:[UIView:0x1d0ae7e0]-(0)-|   (Names: '|':UIView:0x1c596de0 )>

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.
2013-02-22 00:17:41.706 MyApplication[6822:907] 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:0x1c5ab460 V:[PMMainProfilHeader:0x1d09f5b0]-(0)-[UIView:0x1d0ae7e0]>",
    "<NSLayoutConstraint:0x1c5ab3f0 V:|-(0)-[PMMainProfilHeader:0x1d09f5b0]   (Names: '|':UIView:0x1c596de0 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5dcca0 h=--& v=--& UIView:0x1d0ae7e0.midY ==>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5db050 h=--& v=--& PMMainProfilHeader:0x1d09f5b0.midY == + 50>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x1c5ab460 V:[PMMainProfilHeader:0x1d09f5b0]-(0)-[UIView:0x1d0ae7e0]>

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.
2013-02-22 00:17:43.382 MyApplication[6822:907] 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) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x1d0c0530 h=--& v=--& UITableView:0x1db44600.midX ==>",
    "<NSLayoutConstraint:0x1c5ab160 H:[UITableView:0x1db44600]-(0)-|   (Names: '|':UIView:0x1c596de0 )>",
    "<NSLayoutConstraint:0x1c5ab120 H:|-(0)-[UITableView:0x1db44600]   (Names: '|':UIView:0x1c596de0 )>",
    "<NSLayoutConstraint:0x1d0b2000 H:[PMMainProfilHeader:0x1d09f5b0]-(0)-|   (Names: '|':UIView:0x1c596de0 )>",
    "<NSLayoutConstraint:0x1d0b2320 H:|-(0)-[PMMainProfilHeader:0x1d09f5b0]   (Names: '|':UIView:0x1c596de0 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5daf80 h=--& v=--& PMMainProfilHeader:0x1d09f5b0.midX == + 160>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x1c5ab160 H:[UITableView:0x1db44600]-(0)-|   (Names: '|':UIView:0x1c596de0 )>

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.
2013-02-22 00:17:45.290 MyApplication[6822:907] 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) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x1c5dcce0 h=--& v=--& V:[UIView:0x1d0ae7e0(0)]>",
    "<NSLayoutConstraint:0x1c5ab510 V:[UITableView:0x1db44600]-(0)-|   (Names: '|':UIView:0x1c596de0 )>",
    "<NSLayoutConstraint:0x1c5ab4b0 V:[UIView:0x1d0ae7e0]-(0)-[UITableView:0x1db44600]>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5ed510 h=-&- v=-&- UILayoutContainerView:0x1c5d1440.height == UIWindow:0x1c564480.height>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5ef2e0 h=--- v=--- V:[UIWindow:0x1c564480(480)]>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5eb9e0 h=-&- v=-&- UINavigationTransitionView:0x1c5d2b20.height == UILayoutContainerView:0x1c5d1440.height>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5e9f80 h=-&- v=-&- UIViewControllerWrapperView:0x1d0ba580.height == UINavigationTransitionView:0x1c5d2b20.height>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5e8610 h=-&- v=-&- UILayoutContainerView:0x1d096c30.height == UIViewControllerWrapperView:0x1d0ba580.height>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5e6ed0 h=-&- v=-&- UITransitionView:0x1d0999d0.height == UILayoutContainerView:0x1d096c30.height - 49>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5e5980 h=-&- v=-&- UIViewControllerWrapperView:0x1c5cb7a0.height == UITransitionView:0x1d0999d0.height - 20>",
    "<NSAutoresizingMaskLayoutConstraint:0x1d0c0710 h=--& v=--& UITableView:0x1db44600.midY ==>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5e4270 h=-&- v=-&- UIView:0x1c596de0.height == UIViewControllerWrapperView:0x1c5cb7a0.height>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5dcca0 h=--& v=--& UIView:0x1d0ae7e0.midY ==>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x1c5ab4b0 V:[UIView:0x1d0ae7e0]-(0)-[UITableView:0x1db44600]>

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.
2013-02-22 00:17:48.283 MyApplication[6822:907] 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:0x1c5ab510 V:[UITableView:0x1db44600]-(0)-|   (Names: '|':UIView:0x1c596de0 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5ed510 h=-&- v=-&- UILayoutContainerView:0x1c5d1440.height == UIWindow:0x1c564480.height>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5ef2e0 h=--- v=--- V:[UIWindow:0x1c564480(480)]>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5eb9e0 h=-&- v=-&- UINavigationTransitionView:0x1c5d2b20.height == UILayoutContainerView:0x1c5d1440.height>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5e9f80 h=-&- v=-&- UIViewControllerWrapperView:0x1d0ba580.height == UINavigationTransitionView:0x1c5d2b20.height>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5e8610 h=-&- v=-&- UILayoutContainerView:0x1d096c30.height == UIViewControllerWrapperView:0x1d0ba580.height>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5e6ed0 h=-&- v=-&- UITransitionView:0x1d0999d0.height == UILayoutContainerView:0x1d096c30.height - 49>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5e5980 h=-&- v=-&- UIViewControllerWrapperView:0x1c5cb7a0.height == UITransitionView:0x1d0999d0.height - 20>",
    "<NSAutoresizingMaskLayoutConstraint:0x1d0c0710 h=--& v=--& UITableView:0x1db44600.midY ==>",
    "<NSAutoresizingMaskLayoutConstraint:0x1c5e4270 h=-&- v=-&- UIView:0x1c596de0.height == UIViewControllerWrapperView:0x1c5cb7a0.height>",
    "<NSAutoresizingMaskLayoutConstraint:0x1d0c0750 h=--& v=--& V:[UITableView:0x1db44600(0)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x1c5ab510 V:[UITableView:0x1db44600]-(0)-|   (Names: '|':UIView:0x1c596de0 )>

Thanks for reading the whole (huge) post !! Hope someone know why it doesn't work !

Ok, I found the answer...

I just had to call setTranslatesAutoresizingMaskIntoConstraints for each view I'm using constraints with :

[profilHeader setTranslatesAutoresizingMaskIntoConstraints:NO];
[adTest setTranslatesAutoresizingMaskIntoConstraints:NO];
[_tableView setTranslatesAutoresizingMaskIntoConstraints:NO];

Hope it helps someone...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM