addChildViewController

UIViewController has addChildViewController above iOS5.
It can keep child viewcontroller. It means that viewcontroller has hierarchy.
In the past, we can addSubView to add UI components as subview.
In this term, you can add viewcontroller directly.Cool

Method, Property

These are important methods which are related with this topic

@property NSArray *childViewControllers
-(void)addChildViewController
-(void)removeFromParentViewController

In iOS4 viewcontroller doesn’t have child controller, just only child view
Please call lifecycle methods correctly

Sample

ChildViewSampleViewController.h

@interface ChildViewSampleViewController : UIViewController

@end

ChildViewSampleViewController.m

@interface ChildViewSampleViewController ()
@property (nonatomic) UIViewController *root;
@property (nonatomic) UIViewController *overlap;
@property (nonatomic) UIButton *button;
@end

@implementation ChildViewSampleViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view.
    
    self.root = [[UIViewController alloc] init];
    self.root.view.frame = CGRectMake(0, 60, 320, self.view.frame.size.height - 60);
    [self.root.view setBackgroundColor:[UIColor yellowColor]];
    
    [self addChildViewController:self.root];
    [self.root didMoveToParentViewController:self];
    [self.view addSubview:self.root.view];
    
    
    self.button = [[UIButton alloc] initWithFrame:CGRectMake(10, 10, 150, 50)];
    [self.button setTitle:@"Show" forState:UIControlStateNormal];
    [self.button addTarget:self action:@selector(pop:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:self.button];
}

#pragma mark - Event
-(void)pop:(id)sender {
    if (self.overlap == nil ) {
        // Open(Show)
        self.overlap = [[UIViewController alloc] init];
        [self.overlap.view setBackgroundColor:[UIColor redColor]];
        [self addChildViewController:self.overlap];
        
        // Start line
        CGRect startFrame = self.view.frame;
        startFrame.origin.y = startFrame.size.height;
        self.overlap.view.frame = startFrame;
        
        // Move half
        [self transitionFromViewController:self.root
                          toViewController:self.overlap
                                  duration:1.0
                                   options:0
                                animations:^{
                                    CGRect original = self.root.view.frame;
                                    self.overlap.view.frame = CGRectMake(0, original.origin.y, original.size.width, original.size.height);
                                }
                                completion:^(BOOL finished) {
                                    [self.overlap didMoveToParentViewController:self];
                                    [self.button setTitle:@"Hide" forState:UIControlStateNormal];
                                }];
    }
    else {
        // Hide
        [self.overlap willMoveToParentViewController:nil];
        
        // Good-bye
        [self transitionFromViewController:self.overlap
                          toViewController:self.root
                                  duration:1.0
                                   options:0
                                animations:^{
                                    CGRect original = self.root.view.frame;
                                    self.overlap.view.frame = CGRectMake(0, original.size.height, original.size.width, original.size.height);
                                    [self.overlap.view.superview bringSubviewToFront:self.overlap.view];
                                    
                                }
                                completion:^(BOOL finished) {
                                    [self.overlap removeFromParentViewController];
                                    self.overlap = nil;
                                    [self.button setTitle:@"Show" forState:UIControlStateNormal];
                                }];
    }
}

@end

Result

The result is here, click “Show” button, other childview is coming!
addChildViewController - Show

addChildViewController - hide

Ref

Here is nice reference to understand this topic.
UIViewControllerのコンテナ機能(Japanese)
自前コンテナでaddChildViewController:するときdidMoveToParentViewController:はやはり使うべき(Japanese)