How to add child view controller's view over the parent view

autolayout, ios

Solution

A few observations:

You should turn off `translatesAutoresizingMaskIntoConstraints`:

childviewcontroller.view.translatesAutoresizingMaskIntoConstraints = NO;

You should define vertical constraints, too:

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[cview]-|" 
                                                                  options:0
                                                                  metrics:nil                                        
                                                                    views:viewsDictionary]];

Unrelated to your problem, you don't need to create the `[[UIView alloc] init]` for `cview`. You're immediately discarding it.

I'm not sure why you're removing the constraints for `self.view`. (I'm presuming you did that as you were tearing your hair out in your testing.) You don't have to do that. But if you have something else going on here that made you think you needed to do that, let us know what that is.

When adding a child controller, you call `didMoveToParentViewController`, not `willMoveToParentViewController`. The `addChildViewController` calls `willMoveToParentViewController` for you. You only need the `didMove...` rendition.

Thus:

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

Problem

``` - (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]]; } ``` I want to add childviewcontroller view over parent view. After adding I set the constraint but it is not working for me. I am also getting warnings like this ``` 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. ```

Original source