初学iOS,本文翻译了一些iOS官网上的UIViewController的知识点,如有不到位或不正确的地方,还请指正:
本文所介绍的内容的目标:
这是一个UIViewController
两个原因
设计模式
系统视图控制器通包括以下5种
Tableviewcontroller:表视图控制器Detailcontroller:详细控制器SVC:SSLVPNClient
根视图控制器真的可以管理“整个屏幕里显示的内容”么?
window.rootViewController=RootViewController
自定义视图控制器
Appearancecallbacks
(void)viewWillAppear:(void)viewDidAppear:(void)viewWillDisappear:(void)viewDidDisappear:Rotationcallbacks
(void)viewWillRotateToInterfaceOrientation:duration:(void)viewWillAnimateRotationToInterfaceOrientation:(void)viewDidRotateFromInterfaceOrientation:也许在iPhone上很少要关心的屏幕旋转问题的,但是大屏幕的iPad上就不同了,很多时候你需要关心横竖屏。rotationcallbacks一般情况下只需要关心三个方法:willRotateToInterfaceOrientation:duration:在旋转开始前,此方法会被调用;willAnimateRotationToInterfaceOrientation:duration:此方法的调用在旋转动画block的内部,也就是说在此方法中的代码会作为旋转animationblock的一部分;didRotateFromInterfaceOrientation:此方法会在旋转结束时被调用。而作为viewcontrollercontainer就要肩负起旋转的决策以及旋转的callbacks的传递的责任。
总结
了解视图控制器容器
两个层次的故事
蓝色:视图颜色蓝色箭头:子视图关系
金色:视图控制器颜色灰色箭头:父视图控制器关系
层次关系
API和控制器层次
(void)addChildViewController:(UIViewController*)childController;(void)removeFromParentViewController;@property(nonatomic,readonly)NSArray*childViewControllers;(void)willMoveToParentViewController:(UIViewController*)parent;(void)didMoveToParentViewController:(UIViewController*)parent;视图控制器容器层次关系
不一致的层次结构
UIViewControllerHierarchyInconsistencyException为什么会这么糟糕?
[selfaddChildViewController:note];//Transitiontonotecontrollerwithafliptransitionwhichadds//tnenoteviewtothewindowhierarchyandremovestherecipeview.[selftransitionFromViewController:recipetoViewController:noteduration:.5options:UIViewAnimationOptionTransitionFlipFromRightanimations:nilcompletion:^(BOOLfinished){[notedidMoveToParentViewController:self];}];[selfaddChildViewController:note];//Transitiontonotecontrollerwithafliptransitionwhichadds//tnenoteviewtothewindowhierarchyandremovestherecipeview.[selftransitionFromViewController:recipetoViewController:noteduration:.5options:UIViewAnimationOptionTransitionFlipFromRightanimations:nilcompletion:^(BOOLfinished){[notedidMoveToParentViewController:self];}];视图控制器容器API和控制器层次
-(void)transitionFromViewController:(UIViewController*)fromVCtoViewController:(UIViewController*)toVCduration:(NSTimeInterval)durationoptions:(UIViewAnimationOptions)optionsanimations:(void(^)(void))animationscompletion:(void(^)(BOOLfinished))completion;-(void)viewWillLayoutSubviews-(void)viewDidLayoutSubviews连接流——打开和关闭屏幕时获取视图控制器
Containers(容器)
-(void)pushViewController:animated:-(void)popViewControllerAnimated:Presentationanddismissal
-(void)presentModalViewController:animated:-(void)dismissModalViewControllerAnimated:
-(void)presentViewController:(UIViewController*)vcanimated:(BOOL)animatedcompletion:(void(^)(void))completion;-(void)dismissViewControllerAnimated:(BOOL)animatedcompletion:(void(^)(void))completion;
-(UIViewController*)parentViewController;-(UIViewController*)presentingViewController;
视图操作
[root.someViewaddSubview:vc.view]
[rootVCaddChildViewController:vc]
inception(启动)
inception(启动)仅在iPad上
@protocolUISplitViewControllerDelegate...//ReturnsYESifaviewcontrollershouldbehiddenby//thesplitviewcontrollerinagivenorientation.//(Thismethodisonlycalledontheleftmostviewcontroller//andonlydiscriminatesportraitfromlandscape.)-(BOOL)splitViewController:(UISplitViewController*)svcshouldHideViewController:(UIViewController*)vcinOrientation:(UIInterfaceOrientation)orientation;@end设计一个新的应用程序流为修正一个食谱应用创建一个应用程序流
ContainerViewControllerDemo
演示亮点——容器的移动
-(IBAction)flipToNote{if(...){...[selfaddChildViewController:_noteController];[selftransitionFromViewController:_contentControllertoViewController:_noteControllerduration:.5options:UIViewAnimationOptionTransitionFlipFromRightanimations:nilcompletion:^(BOOLfinished){_flipNoteButton.title=@"HideNote";_flipNoteButton.action=@selector(flipFromNote);[_noteControllerdidMoveToParentViewController:self];}];}}-(IBAction)flipFromNote{if(_isNoteBeingShown){[_noteControllerwillMoveToParentViewController:nil];[selftransitionFromViewController:_noteControllertoViewController:_contentControllerduration:0.5options:UIViewAnimationOptionTransitionFlipFromLeftanimations:nilcompletion:^(BOOLfinished){_flipNoteButton.title=@"ShowNote";_flipNoteButton.action=@selector(flipToNote);[_noteControllerremoveFromParentViewController];_isNoteBeingShown=NO;}];}}
Movinginandoutofcontainers
-(void)viewDidAppear:(BOOL)animated{[superviewDidAppear:animated];if(![selfisMovingToParentViewController]){[[selfparentViewController]updateSelectionForListOfContentIdentifiersIfNecessary];}}inception(启动)
-(BOOL)isMovingToParentViewController;//Usedinappearancecallbacks-(BOOL)isMovingFromParentViewController;//Usedindisappearancecallbacks-(BOOL)isBeingPresented;-(BOOL)isBeingDismissed;-(BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers;-(IBAction)flipToNote{if(...){...[selfaddChildViewController:_noteController];[_noteControllerviewWillAppear:YES];//Somefancyanimationthatculminatesintheviewswap//E.g[[_contentController.viewsuperview]addSubview:_noteController.view];...//Finallythisisusuallycalledinacompletionhandler//aftertheanimationcompletes[_noteControllerviewDidAppear:YES];[_noteControllerdidMoveToParentViewController:self];}}容器视图控制器示例为修正一个食谱应用创建一个应用程序流演示亮点——定义演示文稿上下文
-(IBAction)emailContent{UIViewController*presenter=_isNoteBeingShown_noteController:_contentController;...mailController.modalPresentationStyle=UIModalPresentationCurrentContext;if(_contentController&&[MFMailComposeViewControllercanSendMail]){...data=[_contentProviderdataForContentIdentifier:self.contentControllerIdentifiermimeType:&mimeType];note=[_contentProvidernoteForContentIdentifier:self.contentControllerIdentifier];...[presenterpresentViewController:mailControlleranimated:YEScompletion:^{[mailControllerrelease];}];}}
mc.modalPresentationStyle=UIModalPresentationCurrentContext;[rbpresentViewController:mailControlleranimated:YEScompletion:^{...}];
mc.modalPresentationStyle=UIModalPresentationCurrentContext;[notepresentViewController:mailControlleranimated:YEScompletion:^{...}
-(void)viewDidLoad{[superviewDidLoad];self.view.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;self.definesPresentationContext=YES;...}@property(nonatomic,assign)BOOLdefinesPresentationContext;//Acontrollerthatdefinesthepresentationcontextcanalso//specifythemodaltransitionstyleifthispropertyistrue.@property(nonatomic,assign)BOOLprovidesPresentationContextTransitionStyle;视图控制器容器总结
导航与视图之间的页面卷曲过渡
一个容器视图控制器
Initialization(初始化)
-initWithTransitionStyle:navigationOrientation:options:UIPageViewController*myPVC=[[UIPageViewControlleralloc]initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurlnavigationOrientation:UIPageViewControllerNavigationOrientationHorizontaloptions:[NSDictionarydictionaryWithObjectsAndKeys:[NSNumbernumberWithInteger:UIPageViewControllerSpineLocationMid],UIPageViewControllerOptionSpineLocationKey]]初始视图控制器
-setViewControllers:direction:animated:completion:[myPVCsetViewControllers:[NSArrayarrayWithObjects:firstVC,secondVC,nil]direction:UIPageViewControllerNavigationDirectionForwardanimated:NOcompletion:nil];编程导航
[myPVCsetViewControllers:[NSArrayarrayWithObjects:thirdVC,fourthVC,nil]direction:UIPageViewControllerNavigationDirectionForwardanimated:NOcompletion:nil]YES^(BOOLfinished){NSLog(@"Pagecurlcompleted.");}];[myPVCsetViewControllers:[NSArrayarrayWithObjects:thirdVC,fourthVC,nil]direction:UIPageViewControllerNavigationDirectionForwardanimated:completion:YES^(BOOLfinished){NSLog(@"Pagecurlcompleted.");}];