- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
ChildViewController *childviewcontroller = [[ChildViewController alloc] initWithNibName:@"ChildViewController" bundle:nil];
[self addChildViewController:childviewcontroller];
[self.view addSubview:childviewcontroller.view];
[childviewcontroller willMoveToParentViewController:self];
UIView *cview = [[UIView alloc] init];
cview = childviewcontroller.view;
[self.view removeConstraints:self.view.constraints];
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(cview);
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|-[cview]-|"
options:0 metrics:nil
views:viewsDictionary]];
}
我想在父视图上添加childviewcontroller视图。添加后我设置了约束,但它对我不起作用。
我也收到这样的警告
2013-07-25 10:47:30.564 neenah[1105: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:0x9256c90 H:|-(NSSpace(20))-[UIView:0x9256a00] (Names: '|':UIView:0x92557a0 )>",
"<NSAutoresizingMaskLayoutConstraint:0x755d690 h=--& v=--& H:[UIView:0x9256a00(320)]>",
"<NSAutoresizingMaskLayoutConstraint:0x755d5a0 h=--& v=--& UIView:0x9256a00.midX == + 160>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x9256c90 H:|-(NSSpace(20))-[UIView:0x9256a00] (Names: '|':UIView:0x92557a0 )>
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-07-25 10:47:30.567 neenah[1105: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:0x9256bb0 H:[UIView:0x9256a00]-(NSSpace(20))-| (Names: '|':UIView:0x92557a0 )>",
"<NSAutoresizingMaskLayoutConstraint:0x7561690 h=--- v=--- H:[UIWindow:0x92527c0(320)]>",
"<NSAutoresizingMaskLayoutConstraint:0x755fe50 h=-&- v=-&- UIView:0x92557a0.width == UIWindow:0x92527c0.width>",
"<NSAutoresizingMaskLayoutConstraint:0x755d690 h=--& v=--& H:[UIView:0x9256a00(320)]>",
"<NSAutoresizingMaskLayoutConstraint:0x755d5a0 h=--& v=--& UIView:0x9256a00.midX == + 160>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x9256bb0 H:[UIView:0x9256a00]-(NSSpace(20))-| (Names: '|':UIView:0x92557a0 )>
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.
答案 0 :(得分:13)
一些观察结果:
您应该关闭translatesAutoresizingMaskIntoConstraints
:
childviewcontroller.view.translatesAutoresizingMaskIntoConstraints = NO;
您也应该定义垂直约束:
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[cview]-|"
options:0
metrics:nil
views:viewsDictionary]];
与您的问题无关,您无需为[[UIView alloc] init]
创建cview
。你马上放弃它。
我不确定你为什么要删除self.view
的约束。 (我假设你这样做,因为你在测试中撕裂了你的头发。)你不必这样做。但是,如果你在这里有其他事情让你认为你需要这样做,那就让我们知道那是什么。
添加子控制器时,请致电didMoveToParentViewController
,而不是willMoveToParentViewController
。 addChildViewController
为您调用willMoveToParentViewController
。您只需要didMove...
再现。
因此:
- (void)viewDidLoad {
[super viewDidLoad];
// instantiate the view controller
ChildViewController *childViewController = [[ChildViewController alloc] initWithNibName:@"ChildViewController" bundle:nil];
// or you can instantiate using storyboard
//
// ChildViewController *child = [self.storyboard instantiateViewControllerWithIdentifier:@"ChildIdentifier"];
// now do the view controller containment calls to update the view controller hierarchy and add the view as appropriate
[self addChildViewController:childViewController];
childViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:childViewController.view];
[childViewController didMoveToParentViewController:self];
UIView *childView = childViewController.view;
NSDictionary *views = NSDictionaryOfVariableBindings(childView);
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[childView]-|" options:0 metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[childView]-|" options:0 metrics:nil views:views]];
}