IOS 动画
////////////////////////////////////////////////////////////////////////////////////////////
最普通动画:
//开始动画
[UIView
beginAnimations:nil
context:nil];
//设定动画持续时间
[UIView
setAnimationDuration:2];
//动画的内容
frame.origin.x
+= 150;
[img
setFrame:frame];
//动画结束
[UIView
commitAnimations];
除了上述的实现方式 IOS4.0以后推荐用以下的函数进行实现
CGRect rect = [[UIScreen mainScreen] bounds];
self.view.center =
CGPointMake(rect.size.width/2, 720);
[UIView animateWithDuration:0.5f animations:^{
self.view.center = CGPointMake(rect.size.width/2, 240+10);
}
completion:^(BOOL finished) {
// [imageView setImageURL:[NSURL
URLWithString:imgUrl]];
}];
//////////////////////////////////////////////////////////////////////////////////////////////////
//这个只能显示少数几张图片,如果图片多的话 机会崩溃。
连续动画:一个接一个地显示一系列的图像
NSArray *myImages =
[NSArray arrayWithObjects:
[UIImage
imageNamed:@"myImage1.png"],
[UIImage
imageNamed:@"myImage2.png"],
[UIImage
imageNamed:@"myImage3.png"],
[UIImage
imageNamed:@"myImage4.gif"], nil];
UIImageView
*myAnimatedView = [UIImageView alloc];
[myAnimatedView
initWithFrame:[self
bounds]];
myAnimatedView.animationImages = myImages;
//animationImages属性返回一个存放动画图片的数组
myAnimatedView.animationDuration
= 0.25;
//浏览整个图片一次所用的时间
myAnimatedView.animationRepeatCount = 0;
// 0 = loops forever 动画重复次数
[myAnimatedView
startAnimating];
[self
addSubview:myAnimatedView];
[myAnimatedView
release];
//////////////////////////////////////////////////////////////////////////////////////////////////
CATransition *animation=[CATransition
animation];
animation.delegate=self;
animation.duration=1.0f;
animation.timingFunction=UIViewAnimationCurveEaseInOut;
animation.type=kCATransitionMoveIn;
animation.subtype=kCATransitionFromTop;
[myView.layer
addAnimation:animation forKey:@"move in"];
setType:可以返回四种类型
kCATransitionFade淡出
kCATransitionMoveIn覆盖原图
kCATransitionPush推出
kCATransitionReveal底部显出来
setSubtype:也可以有四种类型:
kCATransitionFromRight;
kCATransitionFromLeft(默认值)
kCATransitionFromTop;
kCATransitionFromBottom
还有一种设置动画类型的方法,不用setSubtype,只用setType
animation.type=@"pageCurl";
pageCurl 向上翻一页
pageUnCurl 向下翻一页
rippleEffect 滴水效果
suckEffect
收缩效果,如一块布被抽走
cube 立方体效果
oglFlip 上下翻转效果
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// CoreAnimationEffect.h
// CoreAnimationEffect
//
//
Created by VincentXue on 13-1-19.
// Copyright (c) 2013年 VincentXue. All
rights reserved.
//
#import <Foundation/Foundation.h>
/**
! 导入QuartzCore.framework
*
* Example:
*
*
Step.1
*
* #import "CoreAnimationEffect.h"
*
* Step.2
*
* [CoreAnimationEffect animationMoveLeft:your view];
*
*/
@interface CoreAnimationEffect : NSObject
#pragma
mark - Custom Animation
/**
* @brief 快速构建一个你自定义的动画,有以下参数供你设置.
*
* @note 调用系统预置Type需要在调用类引入下句
*
* #import
<QuartzCore/QuartzCore.h>
*
* @param type
动画过渡类型
* @param subType 动画过渡方向(子类型)
* @param duration
动画持续时间
* @param timingFunction 动画定时函数属性
* @param
theView 需要添加动画的view.
*
*
*/
+
(void)showAnimationType:(NSString *)type
withSubType:(NSString *)subType
duration:(CFTimeInterval)duration
timingFunction:(NSString
*)timingFunction
view:(UIView *)theView;
#pragma mark - Preset Animation
/**
* 下面是一些常用的动画效果
*/
// reveal
+ (void)animationRevealFromBottom:(UIView *)view;
+ (void)animationRevealFromTop:(UIView *)view;
+
(void)animationRevealFromLeft:(UIView *)view;
+
(void)animationRevealFromRight:(UIView *)view;
// 渐隐渐消
+
(void)animationEaseIn:(UIView *)view;
+ (void)animationEaseOut:(UIView
*)view;
// 翻转
+ (void)animationFlipFromLeft:(UIView *)view;
+
(void)animationFlipFromRigh:(UIView *)view;
// 翻页
+
(void)animationCurlUp:(UIView *)view;
+ (void)animationCurlDown:(UIView
*)view;
// push
+ (void)animationPushUp:(UIView *)view;
+
(void)animationPushDown:(UIView *)view;
+ (void)animationPushLeft:(UIView
*)view;
+ (void)animationPushRight:(UIView *)view;
// move
+
(void)animationMoveUp:(UIView *)view duration:(CFTimeInterval)duration;
+
(void)animationMoveDown:(UIView *)view duration:(CFTimeInterval)duration;
+
(void)animationMoveLeft:(UIView *)view;
+ (void)animationMoveRight:(UIView
*)view;
// 旋转缩放
// 各种旋转缩放效果
+
(void)animationRotateAndScaleEffects:(UIView *)view;
// 旋转同时缩小放大效果
+ (void)animationRotateAndScaleDownUp:(UIView *)view;
#pragma mark - Private API
/**
*
下面动画里用到的某些属性在当前API里是不合法的,但是也可以用.
*/
+
(void)animationFlipFromTop:(UIView *)view;
+
(void)animationFlipFromBottom:(UIView *)view;
+
(void)animationCubeFromLeft:(UIView *)view;
+
(void)animationCubeFromRight:(UIView *)view;
+
(void)animationCubeFromTop:(UIView *)view;
+
(void)animationCubeFromBottom:(UIView *)view;
+
(void)animationSuckEffect:(UIView *)view;
+
(void)animationRippleEffect:(UIView *)view;
+
(void)animationCameraOpen:(UIView *)view;
+
(void)animationCameraClose:(UIView *)view;
@end
//
// CoreAnimationEffect.m
// CoreAnimationEffect
//
//
Created by VincentXue on 13-1-19.
// Copyright (c) 2013年 VincentXue. All
rights reserved.
//
#import "CoreAnimationEffect.h"
#import <QuartzCore/QuartzCore.h>
@implementation
CoreAnimationEffect
/**
* 首先推荐一个不错的网站.
http://www.raywenderlich.com
*/
#pragma mark - Custom Animation
+ (void)showAnimationType:(NSString *)type
withSubType:(NSString *)subType
duration:(CFTimeInterval)duration
timingFunction:(NSString
*)timingFunction
view:(UIView *)theView
{
/** CATransition
*
* @see
http://www.dreamingwish.com/dream-2012/the-concept-of-coreanimation-programming-guide.html
* @see http://geeklu.com/2012/09/animation-in-ios/
*
* CATransition 常用设置及属性注解如下:
*/
CATransition *animation =
[CATransition animation];
/** delegate
*
*
动画的代理,如果你想在动画开始和结束的时候做一些事,可以设置此属性,它会自动回调两个代理方法.
*
* @see
CAAnimationDelegate (按下command键点击)
*/
animation.delegate =
self;
/** duration
*
* 动画持续时间
*/
animation.duration = duration;
/** timingFunction
*
* 用于变化起点和终点之间的插值计算,形象点说它决定了动画运行的节奏,比如是均匀变化(相同时间变化量相同)还是
*
先快后慢,先慢后快还是先慢再快再慢.
*
* 动画的开始与结束的快慢,有五个预置分别为(下同):
*
kCAMediaTimingFunctionLinear 线性,即匀速
*
kCAMediaTimingFunctionEaseIn 先慢后快
*
kCAMediaTimingFunctionEaseOut 先快后慢
*
kCAMediaTimingFunctionEaseInEaseOut 先慢后快再慢
*
kCAMediaTimingFunctionDefault 实际效果是动画中间比较快.
*/
/** timingFunction
*
*
当上面的预置不能满足你的需求的时候,你可以使用下面的两个方法来自定义你的timingFunction
* 具体参见下面的URL
*
* @see
http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/CAMediaTimingFunction_class/Introduction/Introduction.html
*
* + (id)functionWithControlPoints:(float)c1x :(float)c1y
:(float)c2x :(float)c2y;
*
* -
(id)initWithControlPoints:(float)c1x :(float)c1y :(float)c2x :(float)c2y;
*/
animation.timingFunction = [CAMediaTimingFunction
functionWithName:timingFunction];
/** fillMode
*
* 决定当前对象过了非active时间段的行为,比如动画开始之前,动画结束之后.
* 预置为:
*
kCAFillModeRemoved 默认,当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态
*
kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态
* kCAFillModeBackwards
和kCAFillModeForwards相对,具体参考上面的URL
* kCAFillModeBoth
kCAFillModeForwards和kCAFillModeBackwards在一起的效果
*/
animation.fillMode = kCAFillModeForwards;
/**
removedOnCompletion
*
* 这个属性默认为YES.一般情况下,不需要设置这个属性.
*
* 但如果是CAAnimation动画,并且需要设置 fillMode 属性,那么需要将 removedOnCompletion
设置为NO,否则
* fillMode无效
*/
// animation.removedOnCompletion =
NO;
/** type
*
* 各种动画效果 其中除了‘fade‘, `moveIn‘,
`push‘ , `reveal‘ ,其他属于似有的API(我是这么认为的,可以点进去看下注释).
*
↑↑↑上面四个可以分别使用‘kCATransitionFade‘, ‘kCATransitionMoveIn‘, ‘kCATransitionPush‘,
‘kCATransitionReveal‘来调用.
* @"cube" 立方体翻滚效果
*
@"moveIn" 新视图移到旧视图上面
* @"reveal"
显露效果(将旧视图移开,显示下面的新视图)
* @"fade" 交叉淡化过渡(不支持过渡方向)
(默认为此效果)
* @"pageCurl" 向上翻一页
*
@"pageUnCurl" 向下翻一页
* @"suckEffect"
收缩效果,类似系统最小化窗口时的神奇效果(不支持过渡方向)
* @"rippleEffect"
滴水效果,(不支持过渡方向)
* @"oglFlip" 上下左右翻转效果
* @"rotate"
旋转效果
* @"push"
*
@"cameraIrisHollowOpen" 相机镜头打开效果(不支持过渡方向)
*
@"cameraIrisHollowClose" 相机镜头关上效果(不支持过渡方向)
*/
/** type
*
* kCATransitionFade 交叉淡化过渡
*
kCATransitionMoveIn 新视图移到旧视图上面
* kCATransitionPush
新视图把旧视图推出去
* kCATransitionReveal 将旧视图移开,显示下面的新视图
*/
animation.type = type;
/** subtype
*
*
各种动画方向
*
* kCATransitionFromRight; 同字面意思(下同)
*
kCATransitionFromLeft;
* kCATransitionFromTop;
*
kCATransitionFromBottom;
*/
/** subtype
*
* 当type为@"rotate"(旋转)的时候,它也有几个对应的subtype,分别为:
* 90cw 逆时针旋转90°
* 90ccw 顺时针旋转90°
* 180cw 逆时针旋转180°
* 180ccw
顺时针旋转180°
*/
/**
*
type与subtype的对应关系(必看),如果对应错误,动画不会显现.
*
* @see
http://iphonedevwiki.net/index.php/CATransition
*/
animation.subtype = subType;
/**
*
所有核心动画和特效都是基于CAAnimation,而CAAnimation是作用于CALayer的.所以把动画添加到layer上.
*
forKey 可以是任意字符串.
*/
[theView.layer addAnimation:animation
forKey:nil];
}
#pragma mark - Preset Animation
+
(void)animationRevealFromBottom:(UIView *)view
{
CATransition
*animation = [CATransition animation];
[animation setDuration:0.35f];
[animation setType:kCATransitionReveal];
[animation
setSubtype:kCATransitionFromBottom];
[animation
setFillMode:kCAFillModeForwards];
[animation
setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseIn]];
[view.layer
addAnimation:animation forKey:nil];
}
+
(void)animationRevealFromTop:(UIView *)view
{
CATransition
*animation = [CATransition animation];
[animation setDuration:0.35f];
[animation setType:kCATransitionReveal];
[animation
setSubtype:kCATransitionFromTop];
[animation
setFillMode:kCAFillModeForwards];
[animation
setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseOut]];
[view.layer
addAnimation:animation forKey:nil];
}
+
(void)animationRevealFromLeft:(UIView *)view
{
CATransition
*animation = [CATransition animation];
[animation setDuration:0.35f];
[animation setType:kCATransitionReveal];
[animation
setSubtype:kCATransitionFromLeft];
[animation
setFillMode:kCAFillModeForwards];
[animation
setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[view.layer
addAnimation:animation forKey:nil];
}
+
(void)animationRevealFromRight:(UIView *)view
{
CATransition
*animation = [CATransition animation];
[animation setDuration:0.35f];
[animation setType:kCATransitionReveal];
[animation
setSubtype:kCATransitionFromRight];
[animation
setFillMode:kCAFillModeForwards];
[animation
setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[view.layer
addAnimation:animation forKey:nil];
}
+
(void)animationEaseIn:(UIView *)view
{
CATransition *animation =
[CATransition animation];
[animation setDuration:0.35f];
[animation setType:kCATransitionFade];
[animation
setFillMode:kCAFillModeForwards];
[animation
setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseIn]];
[view.layer
addAnimation:animation forKey:nil];
}
+
(void)animationEaseOut:(UIView *)view
{
CATransition *animation =
[CATransition animation];
[animation setDuration:0.35f];
[animation setType:kCATransitionFade];
[animation
setFillMode:kCAFillModeForwards];
[animation
setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseOut]];
[view.layer
addAnimation:animation forKey:nil];
}
/**
*
UIViewAnimation
*
* @see
http://www.cocoachina.com/bbs/read.php?tid=110168
*
* @brief
UIView动画应该是最简单便捷创建动画的方式了,详解请猛戳URL.
*
* @method
beginAnimations:context 第一个参数用来作为动画的标识,第二个参数给代理代理传递消息.至于为什么一个使用
*
nil而另外一个使用NULL,是因为第一个参数是一个对象指针,而第二个参数是基本数据类型.
*
@method setAnimationCurve: 设置动画的加速或减速的方式(速度)
* @method
setAnimationDuration: 动画持续时间
* @method
setAnimationTransition:forView:cache: 第一个参数定义动画类型,第二个参数是当前视图对象,第三个参数是是否使用缓冲区
* @method commitAnimations 动画结束
*/
+
(void)animationFlipFromLeft:(UIView *)view
{
[UIView
beginAnimations:nil context:NULL];
[UIView
setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView
setAnimationDuration:0.35f];
[UIView
setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:view
cache:NO];
[UIView commitAnimations];
}
+
(void)animationFlipFromRigh:(UIView *)view
{
[UIView
beginAnimations:nil context:NULL];
[UIView
setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView
setAnimationDuration:0.35f];
[UIView
setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:view
cache:NO];
[UIView commitAnimations];
}
+
(void)animationCurlUp:(UIView *)view
{
[UIView beginAnimations:nil
context:NULL];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
[UIView setAnimationDuration:0.35f];
[UIView
setAnimationTransition:UIViewAnimationTransitionCurlUp forView:view cache:NO];
[UIView commitAnimations];
}
+
(void)animationCurlDown:(UIView *)view
{
[UIView
beginAnimations:nil context:NULL];
[UIView
setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView
setAnimationDuration:0.35f];
[UIView
setAnimationTransition:UIViewAnimationTransitionCurlDown forView:view cache:NO];
[UIView commitAnimations];
}
+
(void)animationPushUp:(UIView *)view
{
CATransition *animation =
[CATransition animation];
[animation setDuration:0.35f];
[animation setFillMode:kCAFillModeForwards];
[animation
setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseOut]];
[animation
setType:kCATransitionPush];
[animation
setSubtype:kCATransitionFromTop];
[view.layer
addAnimation:animation forKey:nil];
}
+
(void)animationPushDown:(UIView *)view
{
CATransition *animation =
[CATransition animation];
[animation setDuration:0.35f];
[animation setFillMode:kCAFillModeForwards];
[animation
setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseOut]];
[animation
setType:kCATransitionPush];
[animation
setSubtype:kCATransitionFromBottom];
[view.layer
addAnimation:animation forKey:nil];
}
+
(void)animationPushLeft:(UIView *)view
{
CATransition *animation =
[CATransition animation];
[animation setDuration:0.35f];
[animation setFillMode:kCAFillModeForwards];
[animation
setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseOut]];
[animation
setType:kCATransitionPush];
[animation
setSubtype:kCATransitionFromLeft];
[view.layer
addAnimation:animation forKey:nil];
}
+
(void)animationPushRight:(UIView *)view
{
CATransition *animation
= [CATransition animation];
[animation setDuration:0.35f];
[animation setFillMode:kCAFillModeForwards];
[animation
setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseOut]];
[animation
setType:kCATransitionPush];
[animation
setSubtype:kCATransitionFromRight];
[view.layer
addAnimation:animation forKey:nil];
}
//
presentModalViewController
+ (void)animationMoveUp:(UIView *)view
duration:(CFTimeInterval)duration
{
CATransition *animation =
[CATransition animation];
[animation setDuration:duration];
[animation setFillMode:kCAFillModeForwards];
[animation
setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[animation
setType:kCATransitionMoveIn];
[animation
setSubtype:kCATransitionFromTop];
[view.layer
addAnimation:animation forKey:nil];
}
// dissModalViewController
+ (void)animationMoveDown:(UIView *)view duration:(CFTimeInterval)duration
{
CATransition *transition = [CATransition animation];
transition.duration =0.4;
transition.timingFunction =
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionReveal;
transition.subtype =
kCATransitionFromBottom;
[view.layer addAnimation:transition
forKey:nil];
}
+ (void)animationMoveLeft:(UIView *)view
{
CATransition *animation = [CATransition animation];
[animation
setDuration:0.35f];
[animation setFillMode:kCAFillModeForwards];
[animation setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseOut]];
[animation
setType:kCATransitionMoveIn];
[animation
setSubtype:kCATransitionFromLeft];
[view.layer
addAnimation:animation forKey:nil];
}
+
(void)animationMoveRight:(UIView *)view
{
CATransition *animation
= [CATransition animation];
[animation setDuration:0.35f];
[animation setFillMode:kCAFillModeForwards];
[animation
setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseOut]];
[animation
setType:kCATransitionMoveIn];
[animation
setSubtype:kCATransitionFromRight];
[view.layer
addAnimation:animation forKey:nil];
}
+(void)animationRotateAndScaleEffects:(UIView *)view
{
[UIView animateWithDuration:0.35f animations:^
{
/**
* @see
http://donbe.blog.163.com/blog/static/138048021201061054243442/
*
* @param transform
形变属性(结构体),可以利用这个属性去对view做一些翻转或者缩放.详解请猛戳↑URL.
*
*
@method valueWithCATransform3D: 此方法需要一个CATransform3D的结构体.一些非详细的讲解可以看下面的URL
*
* @see
http://blog.csdn.net/liubo0_0/article/details/7452166
*
*/
view.transform = CGAffineTransformMakeScale(0.001,
0.001);
CABasicAnimation *animation = [CABasicAnimation
animationWithKeyPath:@"transform"];
// 向右旋转45°缩小到最小,然后再从小到大推出.
animation.toValue = [NSValue
valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 0.70, 0.40, 0.80)];
/**
* 其他效果:
* 从底部向上收缩一半后弹出
* animation.toValue = [NSValue
valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 0.0, 1.0, 0.0)];
*
* 从底部向上完全收缩后弹出
* animation.toValue = [NSValue
valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1.0, 0.0, 0.0)];
*
* 左旋转45°缩小到最小,然后再从小到大推出.
*
animation.toValue = [NSValue
valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 0.50, -0.50, 0.50)];
*
* 旋转180°缩小到最小,然后再从小到大推出.
*
animation.toValue = [NSValue
valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 0.1, 0.2, 0.2)];
*/
animation.duration = 0.45;
animation.repeatCount = 1;
[view.layer addAnimation:animation
forKey:nil];
}
completion:^(BOOL
finished)
{
[UIView animateWithDuration:0.35f
animations:^
{
view.transform =
CGAffineTransformMakeScale(1.0, 1.0);
}];
}];
}
/** CABasicAnimation
*
* @see
https://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CoreAnimation_guide/Articles/KVCAdditions.html
*
* @brief 便利构造函数 animationWithKeyPath:
KeyPath需要一个字符串类型的参数,实际上是一个
*
键-值编码协议的扩展,参数必须是CALayer的某一项属性,你的代码会对应的去改变该属性的效果
*
具体可以填写什么请参考上面的URL,切勿乱填!
* 例如这里填写的是
@"transform.rotation.z" 意思就是围绕z轴旋转,旋转的单位是弧度.
*
这个动画的效果是把view旋转到最小,再旋转回来.
* 你也可以填写@"opacity"
去修改透明度...以此类推.修改layer的属性,可以用这个类.
*
* @param toValue
动画结束的值.CABasicAnimation自己只有三个属性(都很重要)(其他属性是继承来的),分别为:
*
fromValue(开始值), toValue(结束值), byValue(偏移值),
!
这三个属性最多只能同时设置两个;
* 他们之间的关系如下:
*
如果同时设置了fromValue和toValue,那么动画就会从fromValue过渡到toValue;
*
如果同时设置了fromValue和byValue,那么动画就会从fromValue过渡到fromValue + byValue;
*
如果同时设置了byValue 和toValue,那么动画就会从toValue - byValue过渡到toValue;
*
*
如果只设置了fromValue,那么动画就会从fromValue过渡到当前的value;
*
如果只设置了toValue ,那么动画就会从当前的value过渡到toValue;
*
如果只设置了byValue ,那么动画就会从从当前的value过渡到当前value + byValue.
*
*
可以这么理解,当你设置了三个中的一个或多个,系统就会根据以上规则使用插值算法计算出一个时间差并
*
同时开启一个Timer.Timer的间隔也就是这个时间差,通过这个Timer去不停地刷新keyPath的值.
!
而实际上,keyPath的值(layer的属性)在动画运行这一过程中,是没有任何变化的,它只是调用了GPU去
*
完成这些显示效果而已.
*
在这个动画里,是设置了要旋转到的弧度,根据以上规则,动画将会从它当前的弧度专旋转到我设置的弧度.
*
* @param duration
动画持续时间
*
* @param timingFunction
动画起点和终点之间的插值计算,也就是说它决定了动画运行的节奏,是快还是慢,还是先快后慢...
*/
/**
CAAnimationGroup
*
* @brief
顾名思义,这是一个动画组,它允许多个动画组合在一起并行显示.比如这里设置了两个动画,
*
把他们加在动画组里,一起显示.例如你有几个动画,在动画执行的过程中需要同时修改动画的某些属性,
*
这时候就可以使用CAAnimationGroup.
*
* @param duration
动画持续时间,值得一提的是,如果添加到group里的子动画不设置此属性,group里的duration会统一
*
设置动画(包括子动画)的duration属性;但是如果子动画设置了duration属性,那么group的duration属性
*
的值不应该小于每个子动画中duration属性的值,否则会造成子动画显示不全就停止了动画.
*
* @param autoreverses 动画完成后自动重新开始,默认为NO.
*
* @param
repeatCount 动画重复次数,默认为0.
*
* @param animations
动画组(数组类型),把需要同时运行的动画加到这个数组里.
*
* @note addAnimation:forKey
这个方法的forKey参数是一个字符串,这个字符串可以随意设置.
*
* @note
如果你需要在动画group执行结束后保存动画效果的话,设置 fillMode 属性,并且把
*
removedOnCompletion 设置为NO;
*/
+
(void)animationRotateAndScaleDownUp:(UIView *)view
{
CABasicAnimation *rotationAnimation = [CABasicAnimation
animationWithKeyPath:@"transform.rotation.z"];
rotationAnimation.toValue =
[NSNumber numberWithFloat:(2 * M_PI) * 2];
rotationAnimation.duration =
0.35f;
rotationAnimation.timingFunction = [CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
CABasicAnimation *scaleAnimation = [CABasicAnimation
animationWithKeyPath:@"transform.scale"];
scaleAnimation.toValue =
[NSNumber numberWithFloat:0.0];
scaleAnimation.duration = 0.35f;
scaleAnimation.timingFunction = [CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
animationGroup.duration = 0.35f;
animationGroup.autoreverses = YES;
animationGroup.repeatCount = 1;
animationGroup.animations =[NSArray
arrayWithObjects:rotationAnimation, scaleAnimation, nil];
[view.layer
addAnimation:animationGroup forKey:@"animationGroup"];
}
#pragma mark - Private API
+
(void)animationFlipFromTop:(UIView *)view
{
CATransition
*animation = [CATransition animation];
[animation setDuration:0.35f];
[animation setFillMode:kCAFillModeForwards];
[animation
setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseOut]];
[animation
setType:@"oglFlip"];
[animation setSubtype:@"fromTop"];
[view.layer addAnimation:animation forKey:nil];
}
+
(void)animationFlipFromBottom:(UIView *)view
{
CATransition
*animation = [CATransition animation];
[animation setDuration:0.35f];
[animation setFillMode:kCAFillModeForwards];
[animation
setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseOut]];
[animation
setType:@"oglFlip"];
[animation setSubtype:@"fromBottom"];
[view.layer addAnimation:animation forKey:nil];
}
+
(void)animationCubeFromLeft:(UIView *)view
{
CATransition
*animation = [CATransition animation];
[animation setDuration:0.35f];
[animation setFillMode:kCAFillModeForwards];
[animation
setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseOut]];
[animation
setType:@"cube"];
[animation setSubtype:@"fromLeft"];
[view.layer addAnimation:animation forKey:nil];
}
+
(void)animationCubeFromRight:(UIView *)view
{
CATransition
*animation = [CATransition animation];
[animation setDuration:0.35f];
[animation setFillMode:kCAFillModeForwards];
[animation
setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseOut]];
[animation
setType:@"cube"];
[animation setSubtype:@"fromRight"];
[view.layer addAnimation:animation forKey:nil];
}
+
(void)animationCubeFromTop:(UIView *)view
{
CATransition
*animation = [CATransition animation];
[animation setDuration:0.35f];
[animation setFillMode:kCAFillModeForwards];
[animation
setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseOut]];
[animation
setType:@"cube"];
[animation setSubtype:@"fromTop"];
[view.layer addAnimation:animation forKey:nil];
}
+
(void)animationCubeFromBottom:(UIView *)view
{
CATransition
*animation = [CATransition animation];
[animation setDuration:0.35f];
[animation setFillMode:kCAFillModeForwards];
[animation
setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseOut]];
[animation
setType:@"cube"];
[animation setSubtype:@"fromBottom"];
[view.layer addAnimation:animation forKey:nil];
}
+
(void)animationSuckEffect:(UIView *)view
{
CATransition *animation
= [CATransition animation];
[animation setDuration:0.35f];
[animation setFillMode:kCAFillModeForwards];
[animation
setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseOut]];
[animation
setType:@"suckEffect"];
[view.layer addAnimation:animation
forKey:nil];
}
+ (void)animationRippleEffect:(UIView *)view
{
CATransition *animation = [CATransition animation];
[animation
setDuration:0.35f];
[animation setFillMode:kCAFillModeForwards];
[animation setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseOut]];
[animation
setType:@"rippleEffect"];
[view.layer addAnimation:animation
forKey:nil];
}
+ (void)animationCameraOpen:(UIView *)view
{
CATransition *animation = [CATransition animation];
[animation
setDuration:0.35f];
[animation setFillMode:kCAFillModeForwards];
[animation setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseOut]];
[animation
setType:@"cameraIrisHollowOpen"];
[animation setSubtype:@"fromRight"];
[view.layer addAnimation:animation forKey:nil];
}
+
(void)animationCameraClose:(UIView *)view
{
CATransition
*animation = [CATransition animation];
[animation setDuration:0.35f];
[animation setFillMode:kCAFillModeForwards];
[animation
setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseOut]];
[animation
setType:@"cameraIrisHollowClose"];
[animation setSubtype:@"fromRight"];
[view.layer addAnimation:animation forKey:nil];
}
@end
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////