UIViewController containment

iOS 5之前viewcontroller容器是不推荐使用的,这个时期的viewcontroller的任务是管理一个充满屏幕的view。从ios5 之后viewcontroller的任务即演变为管理自己的view。那么究竟是什么原因导致不可以将view controller的view当做子view来用呢

子viewcontroller的view作为子view

众所周知,UIWindow是app的根view,即是屏幕旋转即layout初始化信息源起的地方。由上图所知,子view controller的view是被插入rootviewcontroller的view层级中的,所以layout信息是不会触达这个子view controller的(比如 viewWillAppear)

ios5之前的自定义viewcontroller需要维护子controller的引用,并在自己收到各view事件之后手动触发各子controller的view事件方法, iOS 5之后不需要这样做,但各子view controller的viewwillappear等方法的调用时机规则可能跟独立的Viewcontroller不太一样。

寻找当前地点对应的地球另一面的地点

移动拿着铲子的人,地图会告诉你地球另一面的地点是哪里,点击雷达按钮,地图会轻弹并显示地点的名字。

上图中有两个map view controller,他们每个都可以单独处理拖拽,注释和更新地图。轻弹它们会出现两个新的viewcontroller,这些view controller会呈现位置的详细文字描述。且所有这些都包含在一个父viewcontroller中,持有子view controller的View并确保布局转屏运行正常。

viewcontroller代码

_startMapViewController作为子controller被添加,这会导致子controller的willMoveToParentViewController方法被调用,其view被添加进第一个容器view中,并显示通知其当前拥有parent controller(调用didMoveToParentViewController),_startGeoViewController初始化但并未添加进view层级

viewcontroller之间的切换

基于细粒度的viewcontroller包含api,使得创建及动画的效果可以应用在viewcontroller包含的场景中。切换两个controller的view的方法如下:(transitionFromViewController:toViewController:(...))

切换controller

在添加 toController为子controller时,先通知fromController它将被移除,如果它是包含view层级中的一员,则会调用其viewWillDisappear方法

toController会被通知其新的parentcontroller,并调用相关view事件方法。接着移除fromController

这个transition API方便地将旧view切换出去并为新view腾出空间,然而如果你想自定义切换效果,并只希望同一时刻只出现一个view,则需要对旧View调用 removefromsuperview,并对新view调用 addSubView。如果方法调用顺序出错会得到UIViewControllerHierarchyInconsistency的警告,比如在添加view之前即调用didMoveToParentViewController

为了使用UIViewAnimationOptionTransitionFlipFromTop动画,需要将子view添加为两个容器view的子view,而不是根controller的view,否则动画会是整个root view的效果。

父子controller之间的交互

它们之间只能通过暴露的api进行交互,且父controller需要负责layout子controller的view。父controller不应当修改子controller的view

custom container view controllers

任何时候子controller的view显示在容器的view层次中的时候,容器controller都需要与子controller建立联系并保证将所有适当的controller事件发送给子controller。

容器controller的view层次包含其他controller的view

容器制定规则,子controller需要遵守;容器决定子controller的内容何时出现在其view层次上,同时决定了其出现的位置和大小。必要情况下,容器controller也可以暴露属性和方法以供外界操作。

以navigationcontroller为例 ,当controller从栈上弹出或者入栈时,可以做动态切换

需要注意的是,shouldAutomaticallyForwardAppearanceMethods属性用来标识是否将容器controller的appearance相关的回调,直接传递给子controller。如果是NO,则容器controller负责告诉子controller何时view appear/disappear(通过调用子controller的beginAppearanceTransition:animated: 和 endAppearanceTransition方法来实现),不要直接调用子controller的view will/did appear/disappear方法。

在准备将controller添加进parentcontroller或者移除时,需要在动作之前操作willmovetoparentviewcontroller,之后操作didmovetocontroller,addchildviewcontroller自动调用willmoveto,didmoveto需要在出现的transition结束之后(或者如果没有transition则马上)马上调用, removefromparentviewcontroller自动调用didmovetocontroller,willmoveto需要在remove之前调用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容