zoukankan      html  css  js  c++  java
  • iOS 容器控制器 (Container View Controller)

    iOS 容器控制器 (Container View Controller)

    一个控制器包含其他一个或多个控制器,前者为容器控制器 (Container View Controller),后者为子控制器 (Child View Controller)。UINavigationController、UITabBarController 是常用的容器控制器。本文介绍自定义容器控制器的方法。

    自定义容器控制器

    添加子控制器

    - (void)displayContentController:(UIViewController *)content {
       [self addChildViewController:content];
       content.view.frame = [self frameForContentController];
       [self.view addSubview:self.currentClientView];
       [content didMoveToParentViewController:self];
    }
    

    注意,容器控制器的 addChildViewController: 方法会调用子控制器的 willMoveToParentViewController: 方法,因此不需要写子控制器的 willMoveToParentViewController: 方法。

    移除子控制器

    - (void)hideContentController:(UIViewController *)content {
       [content willMoveToParentViewController:nil];
       [content.view removeFromSuperview];
       [content removeFromParentViewController];
    }
    

    注意,子控制器的 removeFromParentViewController 方法会调用 didMoveToParentViewController: 方法,不用写 didMoveToParentViewController: 方法。

    子控制器之间的转变

    - (void)cycleFromViewController:(UIViewController *)oldVC
                   toViewController:(UIViewController *)newVC {
       // Prepare the two view controllers for the change.
       [oldVC willMoveToParentViewController:nil];
       [self addChildViewController:newVC];
     
       // Get the start frame of the new view controller and the end frame
       // for the old view controller. Both rectangles are offscreen.
       newVC.view.frame = [self newViewStartFrame];
       CGRect endFrame = [self oldViewEndFrame];
     
       // Queue up the transition animation.
       [self transitionFromViewController:oldVC toViewController:newVC
            duration:0.25 options:0
            animations:^{
                // Animate the views to their final positions.
                newVC.view.frame = oldVC.view.frame;
                oldVC.view.frame = endFrame;
            }
            completion:^(BOOL finished) {
               // Remove the old view controller and send the final
               // notification to the new view controller.
               [oldVC removeFromParentViewController];
               [newVC didMoveToParentViewController:self];
            }];
    }
    

    容器控制器的 transitionFromViewController:toViewController:duration:options:animations:completion: 方法将 newVC 的 view 添加进来,执行动画 animations block,动画结束就移除 oldVC 的 view。

    通知子控制器的出现和消失

    - (BOOL)shouldAutomaticallyForwardAppearanceMethods {
        return NO;
    }
    

    如果加上这一句,容器控制器就要在子控制出现和消失时通知子控制器,分别通过调用子控制器的 beginAppearanceTransition:animated: 方法和 endAppearanceTransition() 方法实现,不要直接调用子控制器的 viewWillAppear:、viewDidAppear:、viewWillDisappear:、viewDidDisappear: 方法。

    委托子控制器

    重载 childViewControllerForStatusBarStyle 属性,返回相应的子控制器,让子控制器决定状态栏样式。当这个属性发生变化,调用 setNeedsStatusBarAppearanceUpdate() 方法更新状态栏样式。

    容器控制器可以用子控制器的 preferredContentSize 属性决定子控制器 view 的大小。

    第三方容器控制器

    ViewDeck

    https://github.com/ViewDeck/ViewDeck

    左右侧滑视图,实现侧滑菜单功能。

    SWScrollViewController

    https://github.com/Silence-GitHub/SWScrollViewController

    Scroll view 里加入子控制器的视图,能左右滑动切换子控制器。

    SWSegmentedController

    https://github.com/Silence-GitHub/SWSegmentedController

    通过 UISegmentedControl 切换子控制器。

    转载请注明出处:http://www.cnblogs.com/silence-cnblogs/p/6370049.html

  • 相关阅读:
    如何使用Oracle的Decode函数进行多值判断
    EXP/IMP 命令参数【转】
    EXISTS 的語法【转】
    Oracle10g SQL tune adviser简单介绍【转自ITPUB zhouwf0726】
    EXPDP/IMPDP 参数中文解释【转】
    oracle 中spfile和pfile简介【转自 henli 】
    Oracle NUMBER类型细讲
    ASP.NET的gridview设置数据格式(DataFormatString="{}")与 String.Format 使用总结 .
    asp.net更改文件夹名称及新建文件夹及删除文件夹
    Decimal转换成¥:123.00格式后再转换成Decimal格式的方法
  • 原文地址:https://www.cnblogs.com/silence-cnblogs/p/6370049.html
Copyright © 2011-2022 走看看