LoginSignup
19
19

More than 5 years have passed since last update.

[Objective-C] UISplitViewControllerをコードから生成してiPad対応するまとめ

Posted at

色々調べてみても、Storyboardを使って生成するサンプルが大半で、コードから生成する方法があまり見つからなかったので、コードで作る方法をメモしています。
サンプルはGithubにあげているので、よかったら参照ください。

ビューの入れ子構造を作る

UISplitViewControllerはコンテナViewControllerです。
(コンテナViewControllerについては前に「カスタムContainer View Controllerを作る」に書いているので詳しくはそちら)

最初、左右にViewControllerを配置する方法が分からなかったんですが、単純にviewControllersの配列にふたつのViewControllerを入れてやればいいだけでした。
(サンプルではaddChildViewController:メソッドを使用)

// サンプルコード断片

// UISplitViewControllerを生成
UISplitViewController *splitViewController = [[UISplitViewController alloc] init];

// 左右に配置するViewControllerを生成
UIViewController *viewController1 = [[UIViewController alloc] init];
UIViewController *viewController2 = [[UIViewController alloc] init];

// デリゲート先を設定する
splitViewController.delegate = viewController1;

// 入れ子にしたいViewControllerを追加
// 最初に追加したものが左、次が右に配置される
[splitViewController addChildViewController:viewController1];
[splitViewController addChildViewController:viewController2];

UISplitViewControllerDelegate

どうやら、iPadを縦横にしたときの挙動はUISplitViewControllerが制御しているようです。
そして横向きから縦向きになる瞬間に、とあるデリゲートメソッドが呼ばれる仕組みみたいです。

それ以外の「ビューを隠したり表示したり」という操作はUISplitViewControllerクラスがすべてやってくれます。

UISplitViewControllerDelegateプロトコル

さて、向きが変わる際に呼ばれるデリゲートメソッドは以下のふたつです。
(テンプレートプロジェクトからの引用です)

// 縦向きになるときに呼ばれる
- (void)splitViewController:(UISplitViewController *)splitController
     willHideViewController:(UIViewController *)viewController
          withBarButtonItem:(UIBarButtonItem *)barButtonItem
       forPopoverController:(UIPoopoverController *)popoverController
{
    barButtonItem.title = NSLocalizedString(@"Master", @"Master");
    [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
    self.masterPopoverController = popoverController;
}


// 横向きになるときに呼ばれる
- (void)splitViewController:(UISplitViewController *)splitController
     willShowViewController:(UIViewController *)viewController
  invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
    // Called when the view is shown again in the split view, invalidating the button and popover controller.
    [self.navigationItem setLeftBarButtonItem:nil animated:YES];
    self.masterPopoverController = nil;
}

Githubのサンプルでは、それぞれUIViewControllerを直接入れ子にせずに、さらにUINavigationViewControllerを間にはさんで、タイトルが表示できるようになっています。

19
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
19