在我们开发中,经常会遇到一些需要动画特效的展示,下面来总结一些开发中常见的动画实现方式
第一,帧动画,通过大量的UIImage来展示动画效果,网络请求等待加载动画效果
核心代码:
[objc]view plaincopy
//创建可变数组,存放UIImage对象
NSMutableArray*imageArray = [NSMutableArrayarray];
for(inti; i<=39; i++) {
UIImage*image = [UIImageimageNamed:[NSStringstringWithFormat:@"page_loading_%d",i]];
[imageArrayaddObject:image];
}
把数组设置到ImageView的animationImages上,设置延时和重复次数, 调用开始动画的方法startAnimating开始动画,stopAnimating停止动画
[objc]view plaincopy
self.bgImageView.animationImages= imageArray;
self.bgImageView.animationDuration=4.5;
self.bgImageView.animationRepeatCount=99999;
[self.bgViewaddSubview:self.bgImageView];
if([self.bgImageViewisAnimating]) {
[self.bgImageViewstopAnimating];
}
第二,隐式动画,所谓的隐式动画就是指非Root Layer ,也就是手动创建的CALayer对象,都存在着隐式动画,当对非Root Layer的部分属性进行修改时,默认自动产生一些动画效果
这些属性包括:
1)bounds:用于设置CALyer的高度和宽度.修改这个属性会产生缩放动画
2)backgroundColor:用于设置CALayer的背景色.修改这个属性会产生背景色的渐变动画
3)position:用于设置CALayer的位置.修改这个属性会产生平移动画
4)可以通过通话事务(CATransaction)关闭默认的隐式动画效果
[objc]view plaincopy
[CATransactionbegin];
[CATransactionsetDisableActions:YES];
self.myview.layer.position= CGPointMake(10,10);
[CATransaction commit
第三,核心动画
CAAnimation是所用动画对象的父类,负责控制动画的执行时间和速度,是一个抽象类,不能直接使用,应该使用它的具体子类,
下面介绍一些基本属性:
duration:动画的持续时间
repeatCount:重复次数,无限循环可以设置HUGE_VALF或者MAXFLOAT
repeatDuration:重复时间
removedOnCompletion:默认为YES,代表动画执行完毕后就从图层上移除,图形会恢复到动画执行前的状态。如果想让图层保持显示动画执行后的状态,那就设置为NO,不过还要设置fillMode为kCAFillModeForwards
fillMode:决定当前对象在非active时间段的行为。比如动画开始之前或者动画结束之后
beginTime:可以用来设置动画延迟执行时间,若想延迟2s,就设置为CACurrentMediaTime()+2,CACurrentMediaTime()为图层的当前时间
timingFunction:速度控制函数,控制动画运行的节奏
delegate:动画代理
CAAnimation -- 动画填充模式
fillMode属性值(要想fillMode有效,最好设置removedOnCompletion=NO)
kCAFillModeRemoved这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态
kCAFillModeForwards当动画结束后,layer会一直保持着动画最后的状态
kCAFillModeBackwards在动画开始前,只需要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始。
kCAFillModeBoth这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态
CAAnimation--速度控制函数(CAMediaTimingFunction)
kCAMediaTimingFunctionLinear(线性):匀速,给你一个相对静态的感觉
kCAMediaTimingFunctionEaseIn(渐进):动画缓慢进入,然后加速离开
kCAMediaTimingFunctionEaseOut(渐出):动画全速进入,然后减速的到达目的地
kCAMediaTimingFunctionEaseInEaseOut(渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。这个是默认的动画行为.
CAAnimation -- 动画代理方法
- (void)animationDidStart:(CAAnimation*)anim;//开始动画
- (void)animationDidStop:(CAAnimation*)animfinished:(BOOL)flag;//结束动画
CALayer上动画的暂停和恢复
[objc]view plaincopy
#pragma mark 暂停CALayer的动画
-(void)pauseLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layerconvertTime:CACurrentMediaTime()fromLayer:nil];
// 让CALayer的时间停止走动
layer.speed=0.0;
// 让CALayer的时间停留在pausedTime这个时刻
layer.timeOffset= pausedTime;
}
#pragma mark 恢复CALayer的动画
-(void)resumeLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = layer.timeOffset;
// 1. 让CALayer的时间继续行走
layer.speed=1.0;
// 2. 取消上次记录的停留时刻
layer.timeOffset=0.0;
// 3. 取消上次设置的时间
layer.beginTime=0.0;
// 4. 计算暂停的时间(这里也可以用CACurrentMediaTime()-pausedTime)
CFTimeInterval timeSincePause = [layerconvertTime:CACurrentMediaTime()fromLayer:nil] - pausedTime;
// 5. 设置相对于父坐标系的开始时间(往后退timeSincePause)
layer.beginTime= timeSincePause;
}
CAPropertyAnimation是CAAnimation的子类,也是个抽象类,要想创建动画对象,应该使用它的子类:CABasicAnimation和CAKeyframeAnimation.
CABasicAnimation -- 基本动画
属性说明:
fromValue:keyPath相应属性的初始值
toValue:keyPath相应属性的结束值
动画过程说明:
随着动画的进行,在长度为duration的持续时间内,keyPath相应属性的值从fromValue渐渐地变为toValue
keyPath内容是CALayer的可动画Animatable属性
如果fillMode=kCAFillModeForwards同时removedOnComletion=NO,那么在动画执行完毕后,图层会保持显示动画执行后的状态。但在实质上,图层的属性值还是动画执行前的初始值,并没有真正被改变。
CAKeyframeAnimation -- 关键帧动画CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue),而CAKeyframeAnimation会使用一个NSArray保存这些数值
属性说明:
values:上述的NSArray对象。里面的元素称为“关键帧”(keyframe)。动画对象会在指定的时间(duration)内,依次显示values数组中的每一个关键帧
path:可以设置一个CGPathRef、CGMutablePathRef,让图层按照路径轨迹移动。path只对CALayer的anchorPoint和position起作用。如果设置了path,那么values将被忽略
keyTimes:可以为对应的关键帧指定对应的时间点,其取值范围为0到1.0,keyTimes中的每一个时间值都对应values中的每一帧。如果没有设置keyTimes,各个关键帧的时间是平分的
CAAnimationGroup -- 动画组
动画组,是CAAnimation的子类,可以保存一组动画对象,将CAAnimationGroup对象加入层后,组中所有动画对象可以同时并发运行
属性说明:
animations:用来保存一组动画对象的NSArray
默认情况下,一组动画对象是同时运行的,也可以通过设置动画对象的beginTime属性来更改动画的开始时间
CATransition -- 转场动画
动画属性:
type:动画过渡类型
subtype:动画过渡方向
startProgress:动画起点(在整体动画的百分比)
endProgress:动画终点(在整体动画的百分比)
转场动画过度效果
类型字符串
效果说明
关键字
方向
fade
交叉淡化过渡
YES
push
新视图把旧视图推出去
YES
moveIn
新视图移到旧视图上面
YES
reveal
将旧视图移开,显示下面的新视图
YES
cube
立方体翻滚效果
oglFlip
上下左右翻转效果
suckEffect
收缩效果,如一块布被抽走
NO
rippleEffect
水滴效果
NO
pageCurl
向上翻页效果
pageUnCurl
向下翻页效果
cameraIrisHollowOpen
相机镜头打开效果
NO
cameraIrisHollowClose
相机镜头关闭效果
NO
使用UIView动画函数实现转场动画--单视图
+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void(^)(void))animations completion:(void(^)(BOOLfinished))completion;
参数说明:
duration:动画的持续时间
view:需要进行转场动画的视图
options:转场动画的类型
animations:将改变视图属性的代码放在这个block中
completion:动画结束后,会自动调用这个block
使用UIView动画函数实现转场动画--双视图
+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void(^)(BOOLfinished))completion;
参数说明:
duration:动画的持续时间
options:转场动画的类型
animations:将改变视图属性的代码放在这个block中
completion:动画结束后,会自动调用这个block
总结:很多情况下我们都是在使用UIView封装的的动画,来做动画效果.如果你对上面的核心动画内容掌握了,具体的可以查看下面三个UIView分类
@interface UIView(UIViewAnimation)
@interface UIView(UIViewAnimationWithBlocks)
@interface UIView (UIViewKeyframeAnimations)