'스토리보드'에 해당되는 글 1건

  1. 2014.05.14 (Objective-C) 스토리보드 커스텀 세그에(Storybaord Custom segue) 사용법

스토리보드가 도입되면서 스토리보드상에서 콘트롤러와 콘트롤러를 연결해주기만 하면 전면전환이 되는 편리한 기능이 추가 되었다.

(모달,푸쉬 그리고 애니메이션 옵션등 약간의 설정이 필요하긴 하다.)


예전에 코드로 전부 써주어야 했던것이 스토리보드로 흡수되면서 기본적인 화면전환의 경우는 코드없이도 간단하게 구현이 가능하다.

물론 몇번의 마우스클릭의 수고는 필요.


만약 Modal, Push 형태 이외의 화면전환이 필요한 경우는 화면전환 전용클래스(UIStoryboardSegue)를 이용하여 정의(커스텀)해 줄수 있는데

화면전환에 관련된 코드가 세그에 정의됨으로써 보다 가독성도 높일 수 있다.


스토리보드 사용법에 대해서는 다른 블로그에도 많이 소개 되어 있으므로 세그에(Segue)를 커스텀하여 애니메애션을 주는 방법을 몇가지 소개햐려 한다.



우선 UIStoryboardSegue를 상속받는 세그에(Segue)클래스를 생성한다.


@interface KJCodeMenuSegue : UIStoryboardSegue


@end




정의에는 perform메소드를 재정의 해준다. 여기에서 애니메이션과 화면전환을 정의 해준다.



- Push, Pop 세그에 를 커스텀 할 경우 (modal의 경우도 마찬가지 방법으로 처리해도 된다.)


- (void)perform {

    

//하나의 클래스에 여러개의 처리를 위해 id 이용하여 분기해도 .

NSLog(@"%@", self.identifier);

//뷰콘트롤러 인스턴스 취득

    UIViewController *sourceViewController = (UIViewController *)self.sourceViewController;

    UIViewController *destinationViewController = (UIViewController *)self.destinationViewController;

    

    if (self.identifier isEqualToString:@"menuPush") {

        

        //화면전환 애니메이션

        [UIView transitionWithView:sourceViewController.navigationController.view

                          duration:0.5f

                           options:UIViewAnimationOptionTransitionCrossDissolve

                        animations:^{

                            //실제로 화면전환코드를 작성. 애니메이션은 겹치지 않도록 NO 설정

                            [sourceViewController.navigationController pushViewController:destinationViewController animated:NO];

                        }

                        completion:nil];

        

    }else if(self.identifier isEqualToString:@"menuPush") {

        

        //화면전환 애니메이션

        [UIView transitionWithView:sourceViewController.navigationController.view

                          duration:0.5f

                           options:UIViewAnimationOptionTransitionCrossDissolve

                        animations:^{

                            //실제로 화면전환코드를 작성. 애니메이션은 겹치지 않도록 NO 설정

                            [sourceViewController.navigationController popViewControllerAnimated:NO];

                        }

                        completion:nil];

        

    }

    

}



- 컨테이너뷰에서의 임베디드 세그에(embedSegue)를 커스텀할 경우


- (void) perform {

    

    NSLog(@"%@", self.identifier);

    

    UIViewController *containerViewController = (UIViewController *) self.sourceViewController;

    UIViewController *nextViewController = (UIViewController *) self.destinationViewController;

    UIViewController *currentViewController = (UIViewController *) containerViewController.currentViewController;

    

    //컨테이너 콘트롤러에 화면전환 뷰콘트롤러를 자식뷰콘트롤러로 추가한다.

    [containerViewController addChildViewController:nextViewController];

    // 현재뷰콘트롤러에 이동(삭제) 라는것을 통지한다.

    [currentViewController willMoveToParentViewController:nil];

    

    // 전환될 뷰콘트롤러와 현재 뷰콘트롤러의 크기를 조정한다.

    nextViewController.view.frame = currentViewController.view.frame;

    

    // 화면전환 애니메이션 정의한다.

    [containerViewController transitionFromViewController:currentViewController

                                         toViewController:nextViewController

                                                 duration:0.1f

                                                  options:UIViewAnimationOptionTransitionCrossDissolve

                                               animations:^{

                                                   

                                               }

                                               completion:^(BOOL finished) {

                                                   //컨터이너뷰 안에서의 화면전환처리를 정의한다.

                                                   containerViewController.currentViewController = nextViewController;

                                                   [currentViewController removeFromParentViewController];

                                                   [nextViewController didMoveToParentViewController:containerViewController];

                                               }];

    

}



Posted by 악당잰 트랙백 0 : 댓글 0

댓글을 달아 주세요