Upload
yuichi-fujishige
View
7.057
Download
6
Embed Size (px)
DESCRIPTION
iOS 5 UIViewControllerのコンテナ機能。 第41回 Cocoa勉強会関西の発表資料。
Citation preview
UIViewControllerのコンテナ機能
2011.11.19 ふじしげ ゆういち@nakiwo
コンテナViewController
• ViewControllerの入れ物になるViewController
• UINavigationController• UITabBarController• UISplitViewController
iOS 5
•自分でコンテナViewControllerを作る事ができる新機能
@property UIViewController *parentViewController;@property NSArray *childViewControllers;
- (void) addChildViewController: (UIViewController *)childController;- (void) removeFromParentViewController;
ViewViewController
View
ViewViewController
ViewViewController
View
ViewViewController
ViewViewController
View
iOS 4まで
ViewViewController
ViewViewController
View
iOS 5
- (void) addChildViewController: (UIViewController *)childController;
嬉しい点• UIViewControllerの各種メソッドを適切に呼び出してくれる。
viewWillAppear:viewDidAppear:viewWillDisappear:viewDidDisappear:
willRotateToInterfaceOrientation:duration:willAnimateRotationToInterfaceOrientation:duration: didRotateFromInterfaceOrientation:
etc..
ViewViewController
ViewViewController
View
ViewViewController
NG View階層をたどって最初に見つかるViewControllerがparentViewControllerでない
×
ViewViewController
ViewViewController
View
ViewContollerが親子関係にあるがViewは親子関係にない、はOK(子を表示したくない場合)
ViewViewController
• addChildViewControllerしてもaddSubViewはしてくれないので自分でやる事
• parentViewControllerはiOS 4以前もあるが、iOS 5で仕様が変わった。
• modalのparentViewControllerの扱いiOS 4以前 : modalを出したVC
iOS 5 : nil
• iOS 5 では modalと呼びたくないらしい• modalの親は presentingViewController
/* 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);
presentViewController:animated:completion:dismissViewControllerAnimated:completion:
- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers;
viewWillAppear:viewDidAppear:viewWillDisappear:viewDidDisappear:willRotateToInterfaceOrientation:duration:willAnimateRotationToInterfaceOrientation:duration: didRotateFromInterfaceOrientation:
- (void)willMoveToParentViewController: (UIViewController *)parent;
- (void)didMoveToParentViewController: (UIViewController *)parent;
- (void)willMoveToParentViewController: (UIViewController *)parent;
- (void)didMoveToParentViewController: (UIViewController *)parent;
• addChildViewControllerは willMoveToParentViewControllerを呼んでくれる。
• removeFromParentViewControllerは didMoveToParentViewControllerを呼んでくれる。
• 呼んでくれない方は自分で呼ぶ必要がある。
• アニメーション無しの場合すぐに呼び出し。
• アニメーション有りの場合アニメーション完了後呼び出し。
- (void)transitionFromViewController: toViewController: duration: options: animations: completion:
• viewControllerの入れ替えアニメーション• from/to両方があらかじめ同じviewControllerの子になっている必要がある。
• fromのsuperviewにtoのviewがaddされる。• fromのviewは剥がされる。• viewControllerの親子関係はそのまま。
その他便利メソッド- (void)viewWillLayoutSubviews;- (void)viewDidLayoutSubviews;
- (BOOL)isBeingPresented;- (BOOL)isBeingDismissed;
- (BOOL)isMovingToParentViewController;- (BOOL)isMovingFromParentViewController;
presentViewController:animated:completion:dismissViewControllerAnimated:completion:
Demo
ViewVC(left)
rightContainerViewViewController
デモの構成
ViewVC(right2)
leftContainerView
ViewVC(right1)
ViewVC(MODAL)
•right1,right2,leftは常にchildViewController•MODALは一時的childViewControllerとして登場•right1/right2はどちらかだけview階層にいる•left/MODALはどちらかだけview階層にいる
注意点
• SDK提供のコンテナを子コントローラにすると面倒が多い。wantsFullScreenLayoutとか
• viewを貼っただけでviewWillAppearが呼ばれる。
iOS 4までで自力で呼んでいた人注意
参考資料
•クラスリファレンスとヘッダファイルヘッダの方が詳しい事が多々
•WWDC11のビデオ•今日のサンプルコードhttps://github.com/nakiwo/ViewControllerContainerSample