试图切换能够用transitionFromViewController。

步骤:

View Controller中能够加入多个sub view,在须要的时候显示出来;

能够通过viewController(parent)中能够加入多个child viewController;来控制页面中的sub view。减少代码耦合度;

通过切换,能够显示不同的view;,替代之前的addSubView的管理

代码:

苹果API中所带方法:

addChildViewController: 

removeFromParentViewController 

transitionFromViewController:toViewController:duration:options:animations:completion: 

willMoveToParentViewController: 

didMoveToParentViewController:



以下具体介绍一下addChildViewController,一个ViewController能够加入多个子ViewController,可是这些子ViewControlle要想显示出来,须要把子controller的视图加入到父视图的对应位置r,能够通过transitionFromViewController:toViewController:duration:options:animations:completion:这种方法转换显示的子视图。

同一时候加入对应的动画。

以下以一个样例来说明这几个新方法:

以下具体介绍一下上述效果的实现:

  1. 创建项目,changeViewController。
  2. 加入对应的viewController,MainViewController、FirstViewController、SecondViewController、ThirdViewController。

3.把MainViewController加入到window中。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 



    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    // Override point for customization after application launch. 

    MainViewController *mainViewController=[[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil]; 

    self.window.rootViewController=mainViewController; 

    [self.window makeKeyAndVisible]; 

    return YES; 

}

4.在MainViewController中加入三个按钮。而且连接onClickbutton方法。

5.在MainViewController中加入三个子controller

#pragma mark – View lifecycle

- (void)viewDidLoad 



    [super viewDidLoad]; 

    // Do any additional setup after loading the view from its nib. 

    

    FirstViewController *firstViewController=[[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil]; 

    [self addChildViewController:firstViewController]; 

    

    SecondViewController *secondViewController=[[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; 

    [self addChildViewController:secondViewController]; 

    

    

    ThirdViewController *thirdViewController=[[ThirdViewController alloc] initWithNibName:@"ThirdViewController" bundle:nil]; 

    [self addChildViewController:thirdViewController]; 

    

    [contentView addSubview:thirdViewController.view]; 

    

    currentViewController=thirdViewController; 

    

}

当中要把当中的一个子controller的view加入到根视图中,这样才干显示出对应的视图。

6.点击button,切换视图。

-(IBAction)onClickbutton:(id)sender 



    FirstViewController *firstViewController=[self.childViewControllers objectAtIndex:0]; 

    ThirdViewController *thirdViewController=[self.childViewControllers objectAtIndex:2]; 

    SecondViewController *secondViewController=[self.childViewControllers objectAtIndex:1]; 

    if ((currentViewController==firstViewController&&[sender tag]==1)||(currentViewController==secondViewController&&[sender tag]==2) ||(currentViewController==thirdViewController&&[sender tag]==3) ) { 

        return; 

    } 

    UIViewController *oldViewController=currentViewController; 

    switch ([sender tag]) { 

        case 1: 

        { 

            [self transitionFromViewController:currentViewController toViewController:firstViewController duration:4 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{ 

            }  completion:^(BOOL finished) { 

                if (finished) { 

                    currentViewController=firstViewController; 

                }else{ 

                    currentViewController=oldViewController; 

                } 

            }]; 



            break; 

        case 2: 

        { 

            [self transitionFromViewController:currentViewController toViewController:secondViewController duration:1 options:UIViewAnimationOptionTransitionFlipFromTop animations:^{ 

                

            }  completion:^(BOOL finished) { 

                if (finished) { 

                  currentViewController=secondViewController; 

                }else{ 

                    currentViewController=oldViewController; 

                } 

            }]; 

        } 

            break; 

        case 3: 

        { 

            NSLog(@"好友申请"); 

            [self transitionFromViewController:currentViewController toViewController:thirdViewController duration:1 options:UIViewAnimationOptionTransitionFlipFromBottom animations:^{ 

                

            }  completion:^(BOOL finished) { 

                if (finished) { 

                     currentViewController=thirdViewController; 

                }else{ 

                    currentViewController=oldViewController; 

                } 

            }]; 

        } 

            break; 

        default: 

            break; 

    } 

}

当中我把button设置成不同的tag了。

这时候点击button,就能够切换子视图了。

能够看到,这些view在没有使用时。是不会被load的,而且当有Memory Warning时。当前没有显示的view自己主动被unload掉了。

这样写的优点:

  • 多个UIViewController之间切换能够加入动画
  • 当内存警告的时候。能够把当前不是激活状态的ViewController内存释放。所以新的方法确实能有效地节省内存,也能方便地处理内存不足时的资源回收
  • 能够把代码更好分开

试图切换控制addChildViewController、_transitionFromViewController的更多相关文章

  1. Atitit.软件控件and仪表盘(23)--多媒体子系统--视频输出切换控制cvbs av s-video Ypbpr pal ntsc

    Atitit.软件控件and仪表盘(23)--多媒体子系统--视频输出切换控制cvbs av s-video Ypbpr pal  ntsc 1. CVBS是AV接口 1 2. S-Video S端子 ...

  2. 分段控制器UISegmentedControl的使用、同一个控制器中实现多个View的切换、addChildViewController等方法的使用

    本文先讲解简单的分段控制器UISegmentedControl的使用,然后具体讲解它最常使用的场景:同一个控制器中实现多个View的切换. 文章构思: 1.先直接讲解一张UI效果图的四种实现方式. 2 ...

  3. Linux 普通用户su命令切换控制

    1.编辑配置文件/etc/pam.d/su .将下面配置文件"#“去掉: # auth           required        pam_wheel.so use_uid 改成 a ...

  4. vue 组件 单选切换控制模板 v-bind-is

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>T ...

  5. iOS开发自定义试图切换

    CATransition *transition = [CATransition animation]; transition.duration = 1.0f; transition.timingFu ...

  6. Objective-C ,ios,iphone开发基础:多个视图(view)之间的切换,以及视图之间传值。

    所有的视图都继承自 UIViewController,都使用 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nib ...

  7. app引导页(背景图片切换加各个页面动画效果)

    前言:不知不觉中又加班到了10点半,整个启动页面做了一天多的时间,一共有三个页面,每个页面都有动画效果,动画效果调试起来麻烦,既要跟ios统一,又要匹配各种不同的手机,然后产品经理还有可能在中途改需求 ...

  8. jquery图片播放切换插件

    点击这里查看效果可自定义数字样式和左右点击按钮 这个更好:移入按钮切换版本 更多图片轮播 以下是HTML文件代码: <!DOCTYPE html PUBLIC "-//W3C//DTD ...

  9. 通过gdb跟踪进程调度分析进程切换的过程

    作者:吴乐 山东师范大学 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本实验目的:通过gdb在lin ...

随机推荐

  1. 关于注意力机制(《Attention is all you need》)

    深度学习做NLP的方法,基本上都是先将句子分词,然后每个词转化为对应的词向量序列.(https://kexue.fm/archives/4765) 第一个思路是RNN层,递归进行,但是RNN无法很好地 ...

  2. 利用fabric批量安装kvm虚拟机及其xp

    公司一批PC机需要安装多个虚拟机跑任务,搞来搞去决定用centos7安装KVM来跑.于是先折腾了一下午,利用早先搭建好的cobbler给PC机安装OS.然后fabric批量部署. 环境:centos7 ...

  3. 常用Java开源库(新手必看)

    Jakarta common: Commons LoggingJakarta Commons Logging (JCL)提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具 ...

  4. Qt之图形(QPainter的基本绘图)

    简述 Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice和QPaintEngine这三个类. QPainter用来执行 ...

  5. [Typescript] Installing Promise Type Definitions Using the lib Built-In Types

    To fix Promise is not recolized in TypeScript, we can choose to use a lib: npm i @types/es6-promise ...

  6. SolrCloud怎样创建跟新索引信息

    发送leader,由leader定位地址.然后写到shard上,同一时候copy到replicaton . 如图

  7. pig 调试(explain&amp;illerstrate)

    grunt> cat t.txt kw1 2 kw3 1 kw2 4 kw1 5 kw2 2 cat test.pig A = LOAD '/user/input/t.txt' as (k:ch ...

  8. NET下Assembly的加载过程

    NET下Assembly的加载过程 最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后发现,并没 ...

  9. 5.QT制作编译器,可以简单支持中文编程

    学习了文件操作,那么先做一个自制的IDE吧,就是简单的读取,修改,保存文件,使用QT语言,附上github的代码:QT基本文件操作实现中文编程 截图: 运行效果

  10. python 3.x 学习笔记5 (装饰器)

    1.装饰器: 本质是函数,(装饰其他函数)就是为其他函数添加附加功能 原则: 1)不能修改被装饰的函数的源代码 2)不能修改被装饰的函数的调用方式 2.实现装饰器知识储备: 1)函数即“变量” 2)高 ...