(虽然标记的是原创,但是大部分都是书上的,个人学习过程中,学完这段写点儿东西总结下,本想贴上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过渡,将旧视图移开,显示出下面的新视图