色々調べてみても、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を間にはさんで、タイトルが表示できるようになっています。