본문 바로가기

프로그래밍/iOS,macOS

ChildViewController



Child View Controller

컨트롤러 추가 

addChildViewController: 를 사용해 컨트롤러 추가한다.

addSubView: 로 자식 컨트롤러의 루트뷰를 등록한다.

자식뷰의 사이즈(frame) 정보를 지정한다.

각종 제약등을 설정한다.

자식 컨트롤러의 didMoveToParentViewController: 호출해준다.


addChildViewController: 가 호출되면 자식 컨트롤러를 등록하고, 자식컨트롤러의 willMoveToParentViewController: 를 호출해준다. 자식컨트롤러가 부모 컨트롤러에 추가될때 원하는 초기화 코드를 넣으면되고, 추가 완료 후에는 부모 컨트롤러에서 didMoveToParentViewController: 를 호출해 주어야 한다.


* 오토레이아웃 환경의 경우 자식컨트롤러의 뷰 translateAutoresizingMaskIntoContraints = NO로 해준다.



-(void)showChldController

{

ChildViewController *childController = 

[[ChildViewController alloc] initWithNibName:@"ChildViewController" bundle:nil];


// 오토레이아웃인 경우는

childController.view.translateAutoresizingMaskIntoConstraints = NO;;


[self addChildViewController:childController];

[self.view addSubView:childController.


// 프레임 설정( 오토레이아웃이 아닌경우)

childController.view.frame = CGRectMake(0,0,0,0); // 원하는 사이즈 설정


// 오토레이아웃 제약 설정

NSArray *constraints = childController.view.constraints;

[self.view addConstraints:constraints];



[childController didMoveToParentViewController:self];

}



컨트롤러 삭제

자식컨트롤러에 willMoveToParentViewController: 메쏘드를 호출한다.

제약 사항등을 제거 한다.

자식뷰를 제거한다.

removeFromParentViewController: 를 호출해 자식 컨트롤러를 제거한다.

(자식 스스로 제거할 수도 있다. 이경우는 removeFrom... 과 같은 메소드를 사용)

{

[childController willMoveToParentViewController:nil];

[childController.view removeFromSuperview];

[childController removeFromParentViewController];

}



자식 컨트롤러간 전환

-(void)changeViewController:(UIViewController*) oldVC 

toViewController:(UIViewController*) newVC

{

[oldVC willMoveToParentViewController:nil];

[self addChildViewController:newVC];


[self transitionFromViewController:oldVC 

toViewController: newVC

duration: 0.25

options: 0

animations:^{

newVC.view.frame = oldVC.view.frame;

oldVC.view.frame = CGRectMake(0,0,0,0);

}


completion:^(BOOL finished) {

[oldVC removeFromParentViewController];

[newVC didMoveToParentViewController];

}];

}


오토레이아웃의 경우 프레임이 아닌 제약으로 에니메이션 하기에 조금 다르다

-(void)changeViewController:(UIViewController*) oldVC 

toViewController:(UIViewController*) newVC

{

[oldVC willMoveToParentViewController:nil];

[self addChildViewController:newVC];


self.view addConstraints:[newVC.view.constraints];

[self.view addSubView:newVC.view];

[newVC.view layoutIfNeeded];



[UIView animateWithDuration:

animations:^{


}


completion:^(BOOL finished) {

[oldVC.view removeFromSuperView];

[oldVC removeFromParentViewController];

[newVC didMoveToParentViewController];

}

}];

}