본문 바로가기
프로그래밍 놀이터/iOS

[iOS Study] UISplitViewController

by 돼지왕 왕돼지 2016. 3. 16.
반응형


 [iOS Study] UISplitViewController


출처 : 아론 힐리가스의 iOS 프로그래밍 4판


delegate, detail, detail view controller, DetailView, ios study, ios tutorial, leftBarButtonItem, Master, master view controller, master-detail, navigationitem, nil, protocol, splitViewController, splitViewController:willHideViewController:withBarButtonItem:forPopoverController:, splitViewController:willShowViewController:invalidatingBarButtonItem:, Title, UIBarButtonItem, UIPopoverController, UISplitViewController, UISplitViewControllerDelegate, UIViewController, view controller, [iOS Study] UISplitViewController, 가로 모드, 개발 초기, 델리게이트, 디테일, 디테일 뷰 컨트롤러, 마스터, 마스터 뷰 컨트롤러, 메세지, 문서, 배열, 세로 모드, 스플릿 뷰, 아론 힐리가스, 아이패드, 아이패드 전용, 애플, 앱, 유니버설, 유니버셜, 제목, 초기화, 코드 더미, 클래스, 토의, 팁, 패드, 포인터


-

아이패드는 UISplitViewController 라는 내장 클래스를 사용하여 두 뷰를 보여줄 수 있을 만큼 충분히 큰 화면 크기를 가지고 있다.

UISplitViewController 는 아이패드 전용 클래스로 마스터-디테일 관계의 두 뷰 컨트롤러를 보여준다.

마스터 뷰 컨트롤러는 화면 왼쪽의 작은 영역을 차지하고 디테일 뷰 컨트롤러는 나머지 영역을 차지한다.



-

스플릿 뷰 컨트롤러를 초기화할 때 탭바 컨트롤러에서 했던 것처럼 뷰 컨트롤러의 배열을 전달한다.

다만 스플릿 뷰 컨트롤러의 배열은 두 개의 뷰 컨트롤러로 제한된다.

마스터 뷰 컨트롤러와 디테일 뷰 컨트롤러이다.

배열에서 뷰 컨트롤러의 순서는 스플릿 뷰에서의 역할을 결정한다.

첫 번재 항목은 마스터 뷰 컨트롤러이고 두 번째 항목은 디테일 뷰 컨트롤러이다.



-

세로 모드라면 아무것도 보이지 않을 것이다.

하지만 장치를 가로로 회전하면 화면에 두 개의 뷰 컨트롤러가 보일 것이다.

이것이 UISplitViewController 가 작동하는 방식이다.



-

아무 UIViewController 에게나 splitViewController 메세지를 보낼 수 있다.

그리고 이 뷰 컨트롤러가 스플릿 뷰 컨트롤러의 한 부분이면 스플릿 뷰 컨트롤러의 포인터를 반환할 것이다.

그렇지 않으면 nil 을 반환한다.



-

세로 모드인 경우에는 마스터 뷰 컨트롤러가 기본으로 표시되지 않는다.

UISplitViewController 는 델리게이트와 UIBarButtonItem  을 제공하여 이렇게 할 수 있도록 한다.


세로모드에서도 마스터 뷰를 표시하기 위해서라면..

<UISplitViewControllerDelegate> 를 DetailView 에 protocol 로 지정해주고, 다음을 구현해준다.


// 세로모드로 전활될 때 불리는 Delegate

- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc{

    barButtonItem.title = @"Courses";

    self.navigationItem.leftBarButtonItem = barButtonItem;

}


위와 같이 하면 detail view 의 좌상단에 UIBarButtonItem 이 생겨나고, 해당 버튼을 누르면 UIPopoverController 형태로 master view 가 나타난다.

UIBarButtonItem 을 쉽게 사용하기 위해서는 DetailView 를 UINavigationController 안에 담아두는 것이 좋겠다.


버튼의 title 을 명시적으로 설정해주지 않으면 ( 제목이 없으면 ) 버튼이 표시되지 않을 것이다.



-

위와 같이 구현하면 가로 모드로 돌아갔을 때에도 버튼이 그 자리에 그대로 남아있게 된다.

버튼을 제거하려면 델리게이트는 아래의 메세지를 구현해주어야 한다.


// 가로모드가 될 때 불리는 Delegate

- (void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem{

    if (barButtonItem == self.navigationItem.leftBarButtonItem){

        self.navigationItem.leftBarButtonItem = nil;

    }

}



-

일반적으로 애플이 제공하는 클래스를 사용할 때는 해당 클래스에 관한 문서에서 토의 부분을 읽어야 한다.

다른 장치에서 클래스와 메소드의 사용 여부에 대한 팁을 얻을 수 있다.



-

개발 초기에 앱을 유니버셜화하는 것은 언제나 쉽다.

앱이 복잡해질수록 세부 내용은 엄청난 코드 더미에 묻히게 된다.

코드를 작성하면서 문제를 찾고 고치는 것이 나중에 하는 것보다 훨씬 쉽다.

또한 세부 내용은 찾기도 어렵고 잘못하면 이미 작동 중인 것을 망가뜨릴 위험도 있다.








반응형

'프로그래밍 놀이터 > iOS' 카테고리의 다른 글

[iOS Study] 코어 데이터  (0) 2016.03.25
[iOS Study] 지역화  (0) 2016.03.17
[iOS Study] 웹 서비스와 UIWebView  (0) 2016.03.15
[iOS Study] 유동글자  (0) 2016.03.09
[iOS Study] UITableViewCell 하위 클래스 만들기  (0) 2016.03.08

댓글