transitionFromViewController方法的使用
转自:http://blog.sina.com.cn/s/blog_7b9d64af0101c2vm.html
iOS 5.0 以前 ,我们在一个视图控制器中会用addSubView方法来添加很多子View,并进行对这些子View的控制。
但是,这样做,有一个问题:
一个UIViewController的View可能有很多小的子view。这些子view很多时候被盖在最后,我们在最外层ViewController的viewDidLoad方法中,用addSubview增加了大量的子view。这些子view大多数不会一直处于界面上,只是在某些情况下才会出现,例如登陆失败的提示view,上传附件成功的提示view,网络失败的提示view等。但是虽然这些view很少出现,但是我们却常常一直把它们放在内存中。另外,当收到内存警告时,我们只能自己手工把这些view从super view中去掉。
苹果新的API增加了addChildViewController方法,并且希望我们在使用addSubview时,同时调用[self addChildViewController:child]方法将sub view对应的viewController也加到当前ViewController的管理中。
对于那些当前暂时不需要显示的subview,只通过addChildViewController把subViewController加进去;需要显示时再调用transitionFromViewController方法。将其添加进入底层的ViewController中。
这样做的好处:
1.无疑,对页面中的逻辑更加分明了。相应的View对应相应的ViewController。
2.当某个子View没有显示时,将不会被Load,减少了内存的使用。
3.当内存紧张时,没有Load的View将被首先释放,优化了程序的内存释放机制。
- (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将被载入到页面中。
- (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;
}
-(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方法的使用的更多相关文章
- addChildViewController transitionFromViewController nib storyboard
本文记录addChildViewController由transitionFromViewController方法nib,storyboard的不同的效果. 在进行切换效果时,注意属于同一个story ...
- 分段控制器UISegmentedControl的使用、同一个控制器中实现多个View的切换、addChildViewController等方法的使用
本文先讲解简单的分段控制器UISegmentedControl的使用,然后具体讲解它最常使用的场景:同一个控制器中实现多个View的切换. 文章构思: 1.先直接讲解一张UI效果图的四种实现方式. 2 ...
- childViewController 小计
设置childViewcontroller Unbalanced calls to begin/end appearance transitions for 以上报错 需要添加 transitionF ...
- IOS开发基础知识--碎片10
1:如何给表格单元列增加选择时的背影效果 if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCel ...
- iOS 5.0 后UIViewController新增:willMoveToParentViewController和didMoveToParentViewCon[转]
在iOS 5.0以前,我们在一个UIViewController中这样组织相关的UIView 在以前,一个UIViewController的View可能有很多小的子view.这些子view很多时候 ...
- iOS 5.0 后UIViewController新增:willMoveToParentViewController和didMoveToParentViewCon
在iOS 5.0以前,我们在一个UIViewController中这样组织相关的UIView 在以前,一个UIViewController的View可能有很多小的子view.这些子view很多时候 ...
- willMoveToParentViewController 与 didMoveToParentViewController
在iOS 5.0以前,我们在一个UIViewController中这样组织相关的UIView 在以前,一个UIViewController的View可能有很多小的子view.这些子view很多时候被盖 ...
- iOS UIKit:viewController之动画(5)
当弹出一个view controller时,UIKit提供了一些标准转换动画,并且也支持用户自定义的动画效果. 1 UIView动画 UIView是自带动画实现功能,其中有两种方式实现: ...
- 【转】 iOS开发 剖析网易新闻标签栏视图切换(addChildViewController属性介绍)
原文:http://blog.csdn.net/hmt20130412/article/details/34523235 本来只是打算介绍一下addChildViewController这个方法的,正 ...
随机推荐
- 【树莓派】制作树莓派所使用的img镜像(一)
最近一直在折腾树莓派,前几天装了10台设备,最近又来了15台开发板子.基本每台设备都需要进行如下操作: 1.安装树莓派OS,并配置键盘.时区.语言编码格式等: 2.新增组.用户.配置静态IP地址: 3 ...
- webstorm激活+汉化教程
1.安装教程+激活 输入的激活网址: http://idea.imsxm.com/ 2.汉化教程 软件适用于:webstorm2017.2以及以上,如有需要可直接加本人QQ 1940694428.
- 虚拟机stack全分析
通过jps -lv 获取到本地的一个JVM实例进程.再通过jstack pid > thread.txt ,把stack trace输出到thread.txt文件中. 2012-08-28 2 ...
- SqlServer数据库分离与附加
SQL Server提供了“分离/附加”数据库.“备份/还原”数据库.复制数据库等多种数据库的备份和恢复方法.这里介绍一种学习中常用的“分离/附加”方法,类似于大家熟悉的“文件拷贝”方法,即把数据库文 ...
- IntelliJ IDEA 注册码失效
破解补丁无需使用注册码,下载地址:http://idea.lanyus.com/jar/JetbrainsCrack-2.6.2.jar idea14 keygen下载地址:http://idea.l ...
- CSS实现水平垂直居中方式
1.定位 核心代码实现请看示例代码中的注释: <!DOCTYPE html> <html lang="zh"> <head> <meta ...
- centos7编译python3.6与原有的2.7共存
在某些场景下我们可能需要python2.7和python3这两个版本进行共存,我在工作中也遇到过这样的问题,所以今天来总结下我的安装过程, 我的是用源码包安装的,安装的是python3.6的版本. 安 ...
- updatepanel 和 visibility 有一定冲突
如果出现异常可以将 visibility换成 display
- tomcat7.0.27的bio,nio.apr高级运行模式(转)
一 前言 tomcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或者启动日志.或者登录他们的默认页面http://localhost:8080/查看其中的服务 ...
- log4j 日志 配置 学习
1.用的flume-log4j avrosource的整合 2.学习如何指定类打印日志 #log4j.rootLogger=INFO,flume 这个是将全部的日志会打印出来 log4j.logge ...