转自:http://blog.sina.com.cn/s/blog_7b9d64af0101c2vm.html

1.背景
 

iOS 5.0 以前 ,我们在一个视图控制器中会用addSubView方法来添加很多子View,并进行对这些子View的控制。

 

但是,这样做,有一个问题:

一个UIViewController的View可能有很多小的子view。这些子view很多时候被盖在最后,我们在最外层ViewController的viewDidLoad方法中,用addSubview增加了大量的子view。这些子view大多数不会一直处于界面上,只是在某些情况下才会出现,例如登陆失败的提示view,上传附件成功的提示view,网络失败的提示view等。但是虽然这些view很少出现,但是我们却常常一直把它们放在内存中。另外,当收到内存警告时,我们只能自己手工把这些view从super view中去掉。

2.替代方法
 
聪明的你,也许已经体会到了,该transitionFromViewController方法闪亮登场:
 

苹果新的API增加了addChildViewController方法,并且希望我们在使用addSubview时,同时调用[self addChildViewController:child]方法将sub view对应的viewController也加到当前ViewController的管理中。

对于那些当前暂时不需要显示的subview,只通过addChildViewController把subViewController加进去;需要显示时再调用transitionFromViewController方法。将其添加进入底层的ViewController中。

这样做的好处:

 

1.无疑,对页面中的逻辑更加分明了。相应的View对应相应的ViewController。

2.当某个子View没有显示时,将不会被Load,减少了内存的使用。

3.当内存紧张时,没有Load的View将被首先释放,优化了程序的内存释放机制。

 
3.transitionFromViewController:toViewController:duration:options:animations:completion 方法
 

- (void)transitionFromViewController:(UIViewController *)fromViewControllertoViewController:(UIViewController *)toViewController duration:(NSTimeInterval)durationoptions:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

在两个子视图控制器中转换。支持的iOS 5.0以及以后的版本。

fromViewController:当前显示在父视图控制器中的子视图控制器

toViewController:将要显示的子视图控制器

duration:完成过渡的时间;单位:秒。

options:指定的过渡效果。

animations:转换过程中,的动画。是个Block块操作。

completion:过渡完成后,执行的Block块操作。

该方法,执行完以后,fromViewController指代的视图控制器的View将从界面消失;

toViewController所指代的视图控制器的View将被载入到页面中。

 
4.使用方法
 
1.在父ViewController中,使用方法,将各个子添加进来。
 

- (void)viewDidLoad{

[super viewDidLoad];

// 对于不显示的子ViewController,要用addChildViewController方法,将其添加到父ViewController中

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

[self addChildViewController:firstViewController];

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

[self addChildViewController:secondViewController];

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

[self addChildViewController:thirdViewController];

// 需要显示的子ViewController,要将其View添加到父View中

[self.view addSubview:thirdViewController.view];

currentViewController=thirdViewController;

}

 
2.根据按钮事件,来transitionFromViewController方法来切换相应的子View
 

-(IBAction)onClickbutton:(id)sender

{

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:{

NSLog(@"留言及回复");

[self transitionFromViewController:currentViewController

toViewController:firstViewController

duration:1

options:UIViewAnimationOptionTransitionCurlUp

animations:^{

// NOPS;

}

completion:^(BOOL finished) {

if (finished) {

currentViewController=firstViewController;

}else{

currentViewController=oldViewController;

}

}];

}

break;

case 2:{

NSLog(@"生日提醒");

[self transitionFromViewController:currentViewController

toViewController:secondViewController

duration:1

options:UIViewAnimationOptionTransitionCurlDown

animations:^{

}

completion:^(BOOL finished) {

if (finished) {

currentViewController=secondViewController;

}else{

currentViewController=oldViewController;

}

}];

}

break;

case 3:

{

NSLog(@"好友申请");

[self transitionFromViewController:currentViewController

toViewController:thirdViewController

duration:1

options:UIViewAnimationOptionTransitionCrossDissolve

animations:^{

}

completion:^(BOOL finished) {

if (finished) {

currentViewController=thirdViewController;

}else{

currentViewController=oldViewController;

}

}];

}

break;

default:

break;

}

}

 
注明:该源代码是从上下载的,谢谢该代码作者的分享!
源代码,下载!
 
希望对你有所帮助!

transitionFromViewController方法的使用的更多相关文章

  1. addChildViewController transitionFromViewController nib storyboard

    本文记录addChildViewController由transitionFromViewController方法nib,storyboard的不同的效果. 在进行切换效果时,注意属于同一个story ...

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

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

  3. childViewController 小计

    设置childViewcontroller Unbalanced calls to begin/end appearance transitions for 以上报错 需要添加 transitionF ...

  4. IOS开发基础知识--碎片10

    1:如何给表格单元列增加选择时的背影效果 if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCel ...

  5. iOS 5.0 后UIViewController新增:willMoveToParentViewController和didMoveToParentViewCon[转]

    在iOS 5.0以前,我们在一个UIViewController中这样组织相关的UIView   在以前,一个UIViewController的View可能有很多小的子view.这些子view很多时候 ...

  6. iOS 5.0 后UIViewController新增:willMoveToParentViewController和didMoveToParentViewCon

    在iOS 5.0以前,我们在一个UIViewController中这样组织相关的UIView   在以前,一个UIViewController的View可能有很多小的子view.这些子view很多时候 ...

  7. willMoveToParentViewController 与 didMoveToParentViewController

    在iOS 5.0以前,我们在一个UIViewController中这样组织相关的UIView 在以前,一个UIViewController的View可能有很多小的子view.这些子view很多时候被盖 ...

  8. iOS UIKit:viewController之动画(5)

    当弹出一个view controller时,UIKit提供了一些标准转换动画,并且也支持用户自定义的动画效果. 1 UIView动画 UIView是自带动画实现功能,其中有两种方式实现:        ...

  9. 【转】 iOS开发 剖析网易新闻标签栏视图切换(addChildViewController属性介绍)

    原文:http://blog.csdn.net/hmt20130412/article/details/34523235 本来只是打算介绍一下addChildViewController这个方法的,正 ...

随机推荐

  1. Activiti Designer 5.14.1插件安装和使用

    1.离线包下载 离线安装包下载:https://files.cnblogs.com/files/modou/Activiti_BPMN_2.0_designer.rar 2.安装 先把jars文件夹中 ...

  2. java 设计模式大全

    在线学习网址: http://www.runoob.com/design-pattern/

  3. Emmet初探

    Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生.它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度,比如下面的演示: ...

  4. python easy_install 发生Unable to find vcvarsall.bat错误的处理方法

    用python安装mmseg分词包时发生了 Unable to find vcvarsall.bat 错误 Searching for mmseg Reading http://pypi.python ...

  5. eclipse Java注释修改

      eclipse Java注释修改 CreationTime--2018年6月1日09点15分 Author:Marydon 1.自定义java类自动生成注释的类型 window-->perf ...

  6. scala class和object,trait的区别

    Scala类 1 2 3 4 5 6 7 8 9 10 11 12 13 class Counter {   private var value = 0 // 必须初始化字段   def increm ...

  7. (二)Linux实操之——网络配置、进程管理、服务管理、组管理、YUM

    接上段   (一)Linux实操之——权限.任务调度.磁盘分区 4.网络配置 4.1 NAT模式的网络配置 目前我们采用的网络配置是NAT模式. windows下cmd通过 ipconfig 命令可以 ...

  8. 有效Log4j按指定级别定向输出日志到指定的输出文件地址配置Threshold,log4j中如何屏蔽父logger输出源rootlogger的additivity配置,log4j向多个文件记录日志

    log4j向多个文件记录日志 关键配置,指定想要的日志级别信息输出到指定的日志文件中: log4j.appender.errorLogger.Threshold=ERROR #扩展,可指定只在子类自己 ...

  9. Linux命令-实时监测命令:watch

    watch 是一个非常实用的命令,基本所有的 Linux 发行版都带有这个小工具,如同名字一样,watch 可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行..在Linux下,watch是周期性 ...

  10. Linux命令-工作管理命令:&,ctrl+z,jobs,fg,bg

    在linux下面将一个进程放入后台执行,有两种方式: 第一种方式:&表示命令在后台执行程序,等同于windows里面的程序最小化. 第二种方式:执行某一个命令,例如:top,然后按ctrl+z ...