24
UIViewControllerコンテナ機能 2011.11.19 ふじしげ ゆういち @nakiwo

UIViewController のコンテナ機能

Embed Size (px)

DESCRIPTION

iOS 5 UIViewControllerのコンテナ機能。 第41回 Cocoa勉強会関西の発表資料。

Citation preview

Page 1: UIViewController のコンテナ機能

UIViewControllerのコンテナ機能

2011.11.19 ふじしげ ゆういち@nakiwo

Page 2: UIViewController のコンテナ機能

コンテナViewController

• ViewControllerの入れ物になるViewController

• UINavigationController• UITabBarController• UISplitViewController

Page 3: UIViewController のコンテナ機能

iOS 5

•自分でコンテナViewControllerを作る事ができる新機能

Page 4: UIViewController のコンテナ機能

@property UIViewController *parentViewController;@property NSArray *childViewControllers;

- (void) addChildViewController: (UIViewController *)childController;- (void) removeFromParentViewController;

Page 5: UIViewController のコンテナ機能

ViewViewController

View

Page 6: UIViewController のコンテナ機能

ViewViewController

ViewViewController

View

Page 7: UIViewController のコンテナ機能

ViewViewController

ViewViewController

View

iOS 4まで

Page 8: UIViewController のコンテナ機能

ViewViewController

ViewViewController

View

iOS 5

- (void) addChildViewController: (UIViewController *)childController;

Page 9: UIViewController のコンテナ機能

嬉しい点• UIViewControllerの各種メソッドを適切に呼び出してくれる。

viewWillAppear:viewDidAppear:viewWillDisappear:viewDidDisappear:

willRotateToInterfaceOrientation:duration:willAnimateRotationToInterfaceOrientation:duration: didRotateFromInterfaceOrientation:

etc..

Page 10: UIViewController のコンテナ機能

ViewViewController

ViewViewController

View

ViewViewController

NG View階層をたどって最初に見つかるViewControllerがparentViewControllerでない

×

Page 11: UIViewController のコンテナ機能

ViewViewController

ViewViewController

View

ViewContollerが親子関係にあるがViewは親子関係にない、はOK(子を表示したくない場合)

ViewViewController

Page 12: UIViewController のコンテナ機能

• addChildViewControllerしてもaddSubViewはしてくれないので自分でやる事

Page 13: UIViewController のコンテナ機能

• parentViewControllerはiOS 4以前もあるが、iOS 5で仕様が変わった。

• modalのparentViewControllerの扱いiOS 4以前 : modalを出したVC

iOS 5 : nil

• iOS 5 では modalと呼びたくないらしい• modalの親は presentingViewController

Page 14: UIViewController のコンテナ機能

/* If this view controller is a child of a containing view controller (e.g. a navigation controller or tab bar controller,) this is the containing view controller. Note that as of 5.0 this no longer will return the presenting view controller.*/@property(nonatomic,readonly) UIViewController *parentViewController;

// This property has been replaced by presentedViewController.// It will be DEPRECATED, plan accordingly.@property(nonatomic,readonly) UIViewController *modalViewController;

// The view controller that was presented// by this view controller or its nearest ancestor.@property(nonatomic,readonly) UIViewController *presentedViewController __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);

// The view controller that presented// this view controller (or its farthest ancestor.)@property(nonatomic,readonly) UIViewController *presentingViewController __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);

Page 15: UIViewController のコンテナ機能

presentViewController:animated:completion:dismissViewControllerAnimated:completion:

Page 16: UIViewController のコンテナ機能

- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers;

viewWillAppear:viewDidAppear:viewWillDisappear:viewDidDisappear:willRotateToInterfaceOrientation:duration:willAnimateRotationToInterfaceOrientation:duration: didRotateFromInterfaceOrientation:

Page 17: UIViewController のコンテナ機能

- (void)willMoveToParentViewController: (UIViewController *)parent;

- (void)didMoveToParentViewController: (UIViewController *)parent;

Page 18: UIViewController のコンテナ機能

- (void)willMoveToParentViewController: (UIViewController *)parent;

- (void)didMoveToParentViewController: (UIViewController *)parent;

• addChildViewControllerは willMoveToParentViewControllerを呼んでくれる。

• removeFromParentViewControllerは didMoveToParentViewControllerを呼んでくれる。

• 呼んでくれない方は自分で呼ぶ必要がある。

• アニメーション無しの場合すぐに呼び出し。

• アニメーション有りの場合アニメーション完了後呼び出し。

Page 19: UIViewController のコンテナ機能

- (void)transitionFromViewController: toViewController: duration: options: animations: completion:

• viewControllerの入れ替えアニメーション• from/to両方があらかじめ同じviewControllerの子になっている必要がある。

• fromのsuperviewにtoのviewがaddされる。• fromのviewは剥がされる。• viewControllerの親子関係はそのまま。

Page 20: UIViewController のコンテナ機能

その他便利メソッド- (void)viewWillLayoutSubviews;- (void)viewDidLayoutSubviews;

- (BOOL)isBeingPresented;- (BOOL)isBeingDismissed;

- (BOOL)isMovingToParentViewController;- (BOOL)isMovingFromParentViewController;

presentViewController:animated:completion:dismissViewControllerAnimated:completion:

Page 21: UIViewController のコンテナ機能

Demo

Page 22: UIViewController のコンテナ機能

ViewVC(left)

rightContainerViewViewController

デモの構成

ViewVC(right2)

leftContainerView

ViewVC(right1)

ViewVC(MODAL)

•right1,right2,leftは常にchildViewController•MODALは一時的childViewControllerとして登場•right1/right2はどちらかだけview階層にいる•left/MODALはどちらかだけview階層にいる

Page 23: UIViewController のコンテナ機能

注意点

• SDK提供のコンテナを子コントローラにすると面倒が多い。wantsFullScreenLayoutとか

• viewを貼っただけでviewWillAppearが呼ばれる。

iOS 4までで自力で呼んでいた人注意

Page 24: UIViewController のコンテナ機能

参考資料

•クラスリファレンスとヘッダファイルヘッダの方が詳しい事が多々

•WWDC11のビデオ•今日のサンプルコードhttps://github.com/nakiwo/ViewControllerContainerSample