ViewDeck(Storyboardで利用する)
Facebook likeなスライディングメニューを実装するViewDeck()使い方も簡単でgit hubにばっちり説明してあります。しかし, storyboard上から利用する方法を考えるとちょっと迷います。
そのためのメモです。
今回作成したものは左側にメニューっぽいものを表示させるものです。ViewDeckは,右側もばっちりサポートしていますが, 今回は使用しておりません。
AppDelegateスタート画面に実装する場合
- Story上でUIを作成
- 各ViewControllerに, Storyboard IDをつける
- ViewControllerにスライド用のActionを実装
- AppDelegateにIIViewDeckControllerを作ってrootViewControllerに設定
Storyboard上にUIをつくる
Navigation barでもなんでもよいので, Menu viewを呼び出すためのボタンなどを作ります。各Viewごとに
ViewControllerをつくります。
各ViewControllerに, Storyboard IDをつける
Storyboard IDをつけて, コードからコントローラを呼び出す体制をつくります。
Centerで使用する部分に, CenterView, メニューとして使う左側の部分に, LeftViewと名付けました。
ViewControllerにスライドをするためのActionを実装
CenterであるViewControllerにアクションを実装します。これをNavigation Barのボタンに接続します。
- (IBAction)leftClick:(id)sender { [self.viewDeckController toggleLeftViewAnimated:YES]; }
これでスライドメニューを表示•非表示にするアクションが実装できました。
AppDelegateの実装
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.rootViewController = [self generateControllerStack]; [self.window makeKeyAndVisible]; return YES; } - (IIViewDeckController*)generateControllerStack { UIStoryboard *mystoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; MenuViewController *leftController = [mystoryboard instantiateViewControllerWithIdentifier:@"LeftView"]; UIViewController *centerController = [mystoryboard instantiateViewControllerWithIdentifier:@"CenterView"]; IIViewDeckController* deckController = [[IIViewDeckController alloc] initWithCenterViewController:centerController leftViewController:leftController rightViewController:nil]; deckController.rightSize = 100; [deckController disablePanOverViewsOfClass:NSClassFromString(@"_UITableViewHeaderFooterContentView")]; return deckController; }
storyboardから, 各ViewControllerを取得します。
IIViewDeckControllerのインスタンスを作成して, center, left, rightにかくViewController を割り当てます。
いらない場合はnilにしておきます。
最後に, windowのrootViewControllerに設定すれば, 最初の画面の場合はO.K.です。
AppDelegate以外つまり2ページ目以降に実装する場合
ページの途中で必要な場合上とは違う工夫が必要になります。
CenterとなるViewControllerを作成します。 (IIViewDeckControllerを拡張します)。
– (id)initWithCoder:(NSCoder *)aDecoderというメソッドをOverrideします。
この中で, AppDelegateでやったことと同じようなコードを実装します。
- (id)initWithCoder:(NSCoder *)aDecoder { UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; ViewController1 *centerController = [storyboard instantiateViewControllerWithIdentifier:@"ViewController1"]; ViewController2 *leftController = [storyboard instantiateViewControllerWithIdentifier:@"ViewController2"]; self = [super initWithCenterViewController:centerController leftViewController:leftController]; self.centerhiddenInteractivity = IIViewDeckCenterHiddenNotUserInteractiveWithTapToClose; // Disable touch event when switch other view. self.viewDeckController.bounceOpenSideDurationFactor = 0.3f; if (self) { // Add any extra init code here } return self; }
こんな感じです。これらを管理するための別のViewControllerにこいつを実装します。やっていることはAppDelegateと同じですが,
ViewControllerに実装するのがこつです。