iOS开发导航控制器下不同视图控制器之间切换:利用CATrasition和view的layer层来实现自定义的动画效果

转载自:http://blog.csdn.net/weisubao/article/details/39668173

首先在AppDelegate.m中添加如下代码

 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor whiteColor];
    ViewController* root1 = [[ViewController alloc] init];
    UINavigationController* nav1 = [[UINavigationController alloc] initWithRootViewController:root1];
    
    self.window.rootViewController = nav1;
    [self.window makeKeyAndVisible];

(1)这里的动画效果指的是界面切换的动画效果,我们常见的又淡入淡出,右出左进等等,当然还有一些高级动画,这种动画适合游戏类的,对于一般APP会显得太花哨。


(2)我们在此处没有增加任何框架(QuartzCore)也没有导入什么头文件(QuartzCore.h),就可以直接用CATransiton(相当于是CAAnimation的子类)来创建一个对象,如animation1。


(3)创建完之后我们就对这个动画对象进行动画设置,这里面主要是涉及到type属性,而且值有两种:一种是调用系统自带的一些效果,kCATransition开头的,如animation1.type=kCATransitionPush、kCATransitionMoveIn、kCATransitionFade等;另一种是传入名称的方法,这个名称也是内置的吧,在某一个库里吧(难道就是在QuartzCore.h里?),不管那么多,反正是可以直接用@“ ”来赋值即可,比如animation.type=@"cube"、@“pageCurl”、@“rippleEffect”等。


(4)当然,最重要的时我们这些动画效果都是在导航控制器视图的layer层上的,所以要显示这个动画,得把它加载进去,即直接赋值即可,如[self.navigationController.view.layer addAnimation:animation1 forKey:nil];


(5)还有个次重要的,就是得关闭我们系统默认的动画,[self.navigationController popViewControllerAnimated:NO];也就是设置为NO即可,防止出现怪异的动画叠加。


我们依然是在导航控制器中说的这个事儿,所以当然我们需要创建2个视图控制器放到导航控制器中,用于界面跳转(切换)时用。


这个是根试图控制器ViewController.m文件,核心部分比较简单,三个步骤。

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #import "ViewController.h"  
  2. #import "SecondViewController.h"  
  3.   
  4. @interface ViewController ()  
  5.   
  6. @end  
  7.   
  8. @implementation ViewController  
  9.   
  10. - (void)viewDidLoad {  
  11.     //  
  12.     UIButton *btn1=[UIButton buttonWithType:UIButtonTypeRoundedRect];  
  13.     btn1.backgroundColor=[UIColor whiteColor];  
  14.     btn1.frame=CGRectMake(388030030);  
  15.     [btn1 setTitle:@"JUMP TO SECOND" forState:UIControlStateNormal];  
  16.     [btn1 addTarget:self action:@selector(jumpTo) forControlEvents:UIControlEventTouchUpInside];  
  17.     [self.view addSubview:btn1];  
  18.     [super viewDidLoad];  
  19.     // Do any additional setup after loading the view, typically from a nib.  
  20. }  
  21.   
  22. -(void)jumpTo{  
  23.     SecondViewController *second1=[[SecondViewController alloc]init];  
  24.     //简单三步(1)实例化一个转化动画对象animation2(2)设置一个动画pageCurl(3)把这个动画对象加载到导航控制器视图的layer层上  
  25.     CATransition *animation2=[CATransition animation];  
  26.     animation2.type=@"oglFlip";  
  27.     [self.navigationController.view.layer addAnimation:animation2 forKey:nil];  
  28.     //当然,我们需要关闭默认的动画,<span style="font-family: Arial, Helvetica, sans-serif;">虽然有些动画不受影响,但有的会和默认动画叠加</span>  
  29.     [self.navigationController pushViewController:second1 animated:NO];  
  30. }  
  31.   
  32. @end  

下面这个是子页面的SecondViewController.m的文件:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #import "SecondViewController.h"  
  2.   
  3. @interface SecondViewController ()  
  4.   
  5. @end  
  6.   
  7. @implementation SecondViewController  
  8.   
  9. - (void)viewDidLoad {  
  10.     //  
  11.     UIBarButtonItem *barBtn1=[[UIBarButtonItem alloc]initWithTitle:@"回家" style:UIBarButtonItemStylePlain target:self action:@selector(backTo)];  
  12.     self.navigationItem.leftBarButtonItem=barBtn1;  
  13.     self.view.backgroundColor=[UIColor purpleColor];  
  14.     [super viewDidLoad];  
  15.     // Do any additional setup after loading the view.  
  16. }  
  17.   
  18. -(void)backTo{  
  19.     //默认的动画效果是:从右向左出来,从左向右回去  
  20.       
  21.     //不论哪种方法,先创建一个切换对象即CATransition对象  
  22.     CATransition *animation1=[CATransition animation];  
  23.     //然后设置切换的时间,即动画的时间  
  24.     animation1.duration=1;  
  25.     //下面是重头戏,有好几种方法设置动画的类型  
  26.     //第一种是:用默认的type和subtype来设置系统自带的,有7、8种简单基本的,但貌似subtype依然失效了,总之,用type来设置系统自带的8种足够  
  27.     //从上下左右出现,以及Fade、MoveIn、Push、Reveal等8种简单的  
  28.     animation1.type=kCATransition;  
  29.     animation1.subtype=kCATransitionPush;  
  30.       
  31.     //第二种方式,直接用名字来定义,难道这个需要QuartzCore框架支持么?xcode6貌似已经配置了,不需要导入任何头文件,而且这个效果会覆盖上面第一种用到得8中默认简单动画  
  32.     //如cube、rippleEffect、suckEffect、oglFlip、pageCurl、pageUnCurl  
  33.     animation1.type=@"oglFlip";  
  34.       
  35.     //设置完动画后,就是设置动画的时机,也就是显示和退出效果比如淡入淡出等等  
  36.     //貌似没有什么效果,而且还是可以省略不写的  
  37.     [animation1 setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];  
  38.     //最重要的一步,是把这个动画加载到导航控制器的view的layer层  
  39.     [self.navigationController.view.layer addAnimation:animation1 forKey:nil];  
  40.     //把默认的动画关闭,虽然有些动画不受影响,但有的会和默认动画叠加  
  41.     [self.navigationController popViewControllerAnimated:NO];  
  42. }  
  43.   
  44. - (void)didReceiveMemoryWarning {  
  45.     [super didReceiveMemoryWarning];  
  46.     // Dispose of any resources that can be recreated.  
  47. }  
  48.   
  49. @end  

动画效果用LICEcap录制,本地查看正常,上传到这里不动了,汗,再传最后一次。(解决方案:上传到其他地方,再把图片链接引用过来)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值