博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UIViewController之[自定义容器视图控制器]
阅读量:5874 次
发布时间:2019-06-19

本文共 3820 字,大约阅读时间需要 12 分钟。

hot3.png

1.简介

Container的主要职责就是管理一个或多个Child View Controller的展示的生命周期,需要传递显示以及旋转相关的回调

一个app首先有一个主window,window指定一个rootViewController

window会将相关的回调传递给rootViewController

rootViewController需要再将这些callbacks的调用传递给它的Child View Controllers

显示相关的回调:appearance callbacks(          viewWillAppear:          viewWillDisappear:          viewDidAppear:          viewDidDisappear: )旋转相关的回调:rotation callbacks(          willRotateToInterfaceOrientation:duration:           willAnimateRotationToInterfaceOrientation:duration:,          didRotateFromInterfaceOrientation:)

2.父子关系(parentViewController--subViewController)

实现一个Custom Container View Controller分为两个阶段

①父子关系的建立②️父子关系的解除
2.1建立父子关系
//将subViewController添加为child view controller,addChildViewController:接口建立了逻辑上的父子关系    //子可以通过parentViewController,访问其父VC    //addChildViewController:接口的逻辑中会自动调用 [subViewController willMoveToParentViewController : parentViewController];     [parentViewController addChildViewController : subViewController];    //建立父子关系后,便是将content的view加入到父VC的view hierarchy(层次结构)上    [parentViewController.view addSubview : subViewController.view];    //调用child的 didMoveToParentViewController: ,以通知child,完成了父子关系的建立    [subViewController didMoveToParentViewController : parentViewController];
2.2解除父子关系
//通知child,即将解除父子关系    [self willMoveToParentViewController:nil];    //将child的view从父VC的view的hierarchy中移除    [self.view removeFromSuperview];    //通过removeFromParentViewController的调用真正的解除关系    //removeFromParentViewController会自动调用 [content didMoveToParentViewController:nil]    [self removeFromParentViewController];

3. appearance callbacks的传递

生命周期:

alloc -> initWithNibName -> loadView -> viewDidLoad -> viewWillAppear -> viewDidAppear -> viewWillDisappear -> viewDidDisappear -> dealloc

其实,callbacks系统会自动调用,但是有些需求自动调用不能满足需求,如:

child view的展示有一个动画的过程,这个时候我们并不想viewDidAppear的调用在addSubview的时候进行,而是等展示动画结束后再调用viewDidAppear。

自定义容器中需要关闭自动调用callbacks,自己去控制callbacks的调用时机

3.1如何关闭自动传递:
IOS5: automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers        return NO;    IOS6+:shouldAutomaticallyForwardAppearanceMethods        return NO;
3.2手动传递

手动传递需要用到一下两个方法, 而且必须成对出现

beginAppearanceTransition:animated:endAppearanceTransition
//触发subViewController的viewWillAppear    [subViewController beginAppearanceTransition:YES animated:animated];                   //触发subViewController的viewWillDisappear    [subViewController beginAppearanceTransition:NO animated:animated];    //触发对应的viewDidAppear和viewDidDisappear    [subViewController endAppearanceTransition];
例子
/***将subViewController添加入parentViewController中*调用该方法后,可以添加子控制器显示时的动画效果*/-(void)addToParentViewContoller:(UIViewController *)parentViewController subViewController:(UIViewController*)subViewController{    [subViewController beginAppearanceTransition:YES animated:animated];     [parentViewController addChildViewController : subViewController];    [parentViewController.view addSubview : subViewController.view];    [subViewController didMoveToParentViewController : parentViewController];    [subViewController endAppearanceTransition];     }/*** 将subViewController从parentViewController中删除*/-(void)removeFromParentViewContoller:(UIViewController *)parentViewController subViewController:(UIViewController*)subViewController{    [subViewController beginAppearanceTransition:NO animated:animated];     [subViewController willMoveToParentViewController:nil];    [subViewController.view removeFromSuperview];    [subViewController removeFromParentViewController];    [subViewController endAppearanceTransition];     }

4. rotation callbacks的传递

转屏时才会需要关注的问题

4.1如何关闭自动传递:
IOS5: automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers        return NO;    IOS6+:shouldAutomaticallyForwardRotationMethods        return NO;

转屏时触发的函数:请参照如下链接:

更多详细内容请参照如下链接:

转载于:https://my.oschina.net/u/2462423/blog/531997

你可能感兴趣的文章
LeetCode – LRU Cache (Java)
查看>>
JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)...
查看>>
【转】 学习ios(必看经典)牛人40天精通iOS开发的学习方法【2015.12.2
查看>>
nginx+php的使用
查看>>
在 ASP.NET MVC 中使用异步控制器
查看>>
SQL语句的执行过程
查看>>
Silverlight开发历程—动画(线性动画)
查看>>
详解Linux中Load average负载
查看>>
HTTP 协议 Cache-Control 头——性能啊~~~
查看>>
丢包补偿技术概述
查看>>
PHP遍历文件夹及子文件夹所有文件
查看>>
WinForm程序中两份mdf文件问题的解决
查看>>
【转】唯快不破:创业公司如何高效的进行产品研发管理
查看>>
Spark RDD、DataFrame原理及操作详解
查看>>
程序计数器、反汇编工具
查看>>
Android N: jack server failed
查看>>
007-Shell test 命令,[],[[]]
查看>>
关于Linux系统使用遇到的问题-1:vi 打开只读(readonly)文件如何退出保存?
查看>>
pandas 按照某一列进行排序
查看>>
在WPF中如何使用RelativeSource绑定
查看>>