iPhone 实现动画效果

(虽然标记的是原创,但是大部分都是书上的,个人学习过程中,学完这段写点儿东西总结下,本想贴上demo程序的,竟然没找到上传附件的地方。。。)

iPhone中实现动画,主要有两种方式:UIView的动画块和Core Animation的CATransition类。

 

1、UIView的动画块 

之所以称为动画块,是因为UView动画是成块运行的,也就是说作为完整的事务一次性运行。

beginAnimation:context:标志动画块开始;

commitAnimations标志动画块结束。(这个commit多少已经暗示这个操作是事务性的)

这里面通常涉及4个操作:

beginAnimation:context:标志动画块开始

setAnimationCurve:定义动画加速或减速的方式,有四种,ease-in/ease-out,ease-in,linear,ease-out

setAnimationDuration:定义动画持续时间(以秒为单位)

commitAnimations:标志动画块结束

所有这些操作都是针对UIView的,或者说是UIView的类函数。给段代码示例:

CGContextRef context = UIGraphicsGetCurrentContext();[UIView beginAnimations:nil context:context];[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];[UIView setAnimationDuration:2.0f];[UIView setAnimationBeginsFromCurrentState:YES];[UIView setAnimationDelegate:self];[UIView setAnimationDidStopSelector:@selector(animationFinished:)];[self.imageView setTransform:CGAffineTransformMakeScale(0.25f, 0.25f)];[UIView commitAnimations]; 

(这里面设置了动画的delegate,在动画结束后执行animationFinished:函数)

UIView除了实现上面这种简单的动画,还支持视图的翻转。例如在上面代码的[UIView commitAnimations]前加上下面这句,便可以实现视图的翻转(翻转后的试图中,imageView的大小变为原来的0.25倍):

[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES];

其中,参数UIViewAnimationTransitionFlipFromLeft定义了翻转的方式。参见文后的表格,列出了所有的翻转方式。

2、Core Animation (CA)

这种方式提供了高度灵活的动画解决方案(书上说的,我还没体会到有多灵活。。。)。CA只是针对图层,不针对视图。

这里说的图层就是视图的默认图层([myView layer],UIView的文档中,关于这个属性也没多说什么,只是说这个属性以uivew作为delegate,并且该属性不可能为空)。下面展示一段用CA实现视图过渡的代码:

CATransition *animation = [CATransition animation];animation.delegate = self;animation.duration = 1.0f;animation.timingFunction = UIViewAnimationCurveEaseInOut;animation.type = kCATransitionMoveIn;animation.subtype = kCATransitionFromRight;// Perform the animationUIView *whitebg = [self.view viewWithTag:10];NSInteger purple = [[whitebg subviews] indexOfObject:[whitebg viewWithTag:99]];NSInteger white = [[whitebg subviews] indexOfObject:[whitebg viewWithTag:100]];[whitebg exchangeSubviewAtIndex:purple withSubviewAtIndex:white];[[whitebg layer] addAnimation:animation forKey:@"animation"]; 

从代码可以看出,基本方式和第1点介绍的UIView的动画块差不多,先是开始,然后设置视图的变化,然后结束。

CATransition的type有四种,见最后的视图过渡类型表格。

subtype也是四种,分别是从上、下、左、右进入。

其实,上面这段代码,并不是使用CA的一般方式(或者说通用方式),下面展示下一般方式:

UIView *theView = [self.view viewWithTag:101];[CATransaction begin]; [CATransaction setValue:[NSNumber numberWithFloat:ANIMATION_DURATION] forKey:kCATransactionAnimationDuration]; // scale it down CABasicAnimation *shrinkAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];shrinkAnimation.delegate = self; shrinkAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; shrinkAnimation.toValue = [NSNumber numberWithFloat:0.0];[[theView layer] addAnimation:shrinkAnimation forKey:@"shrinkAnimation"]; [CATransaction commit];  

(这段代码纯粹书上借鉴的,来自于www.lucasnewman.com中的一个示例。)

代码中使用了key path,KVC的强大又一次体现。

附录:Cocoa中视图过渡的方式

 

UIViewAnimationTransitionFlipFromLeft UIView过渡,从左向右翻转

UIViewAnimationTransitionFlipFromRight UIView过渡,从右向左翻转

UIViewAnimationTransitionFlipCulUp UIView过渡,从下向上翻转,翻页效果,非常不错

UIViewAnimationTransitionFlipCulDown UIView过渡,从上向下翻转

 

kCATransitionFade CA交叉淡化过渡

kCATransitionMoveIn CA过渡,新视图移到旧视图上

kCATransitionPush CA过渡,新视图将旧视图挤开

kCATransitionReveal CA过渡,将旧视图移开,显示出下面的新视图

你可能感兴趣的:(cocoa,cache,iPhone,animation,UIView,layer)