UISplitViewController의 마스터 뷰 표시/숨기기 전환

4815 단어 iPad


UISplitViewController의 마스터 뷰 표시/숨기기를 버튼 탭이 아닌 프로그램에서 전환하는 방법에 관한 것입니다.

UISplitViewController 클래스는 -splitViewController:shouldHideViewController:inOrientation:대리자 메서드나 대리자 메서드에 전달된 UIBarButtonItem 객체를 사용하여 Master 뷰(왼쪽에 표시되는 뷰)를 표시/숨길 수 있습니다. 예를 들어 다음과 같이 델리게이트 메서드를 구현하는 경우 세로로 표시할 때 마스터 보기를 숨기고 전체 화면에서 세부 보기(오른쪽에 표시)를 표시할 수 있습니다.
/* orientationで示す方向で、マスタービューを隠すかどうか
 * UISplitViewControllerのビュー表示時、あるいはデバイス方向を変えたときに呼ばれる
 */
- (BOOL)splitViewController:(UISplitViewController *)svc        // ← UISplitViewController
   shouldHideViewController:(UIViewController *)vc              // ← マスタービューのビューコントローラ
              inOrientation:(UIInterfaceOrientation)orientation // ← 方向(UISplitViewController)
{
    // 縦方向のときは隠す。横方向では表示
    return UIInterfaceOrientationIsPortrait(orientation);
}

또, 다른 -splitViewController:willHideViewController:withBarButtonItem:forPopoverController:대리자 메소드로 건네받는 UIBarButtonItem에는, UISplitViewController 오브젝트와 그 메소드가, 각각 target 및 action 프로퍼티에 세트 되고 있습니다. 따라서, 툴바나 네비게이션 바에 세트 해 두면, 유저의 조작으로 마스터 뷰를 자유롭게 내보내거나 지울 수 있습니다.
- (void)splitViewController:(UISplitViewController *)splitController
     willHideViewController:(UIViewController *)viewController
          withBarButtonItem:(UIBarButtonItem *)barButtonItem
       forPopoverController:(UIPopoverController *)popoverController
{
    NSLog(@"action:[%@] target:[%@]", NSStringFromSelector(barButtonItem.action), barButtonItem.target);
    // → action:[toggleMasterVisible:] target:[<UISplitViewController: 0x…>]
}

그런데 여기에 문제가 있고, 마스터 뷰의 표시를 전환하는 수단이 UIBarButtonItem에서 밖에 제공되지 않고, 그 중에서 호출하고 있는 API가 프라이빗 API이므로, 프로그램으로부터 직접 호출할 수 없는 것입니다.
"어떤 항목을 선택할 때만 화면을 넓게 하고 사용하고 싶다""화면상의 툴바나 네비게이션 바 이외의 UI로 버튼을 설치하고 싶다"라는 유스 케이스는 자주 있습니다만, 이것으로는 그런 요구에는 응할 수 없습니다 응. 어째서 이런 설계로 했는지 모르겠지만, 어쨌든 무리한 것은 무리입니다.

그럼 어떻게 하면 좋을까. 비공개 API를 명시적으로 호출하지 않고 안전하게 표시/숨기기를 전환하는 방법은 사실 간단한 방법입니다. 다음과 같이 barButtonItem의 target 및 action 속성 정보를 그대로 사용하여 메시지를 보냅니다.
// UISplitViewControllerにMasterビューの表示切り替えを要求する
// ※ barButtonItemはデリゲートメソッドで届いたときに保持しておく
[barButtonItem.target performSelector:barButtonItem.action];

이렇게 하면 UISplitViewController의 내부 API를 접하고 알지 않고 목적을 달성할 수 있습니다. 어떤 UI나 제스처라도 뷰의 표시를 바꿀 수 있군요.

@ikesyo 씨, Twitter로 곤란하고 있을 때에 코멘트 해 주셔서 감사합니다.

좋은 웹페이지 즐겨찾기