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.
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!
Ref
Here is nice reference to understand this topic.
UIViewControllerのコンテナ機能(Japanese)
自前コンテナでaddChildViewController:するときdidMoveToParentViewController:はやはり使うべき(Japanese)