(一)使用UIIamge创建动画
- 不需要手动释放内存
- animatedImageNamed方法,会自动去找文件名以ship-anim开头的图片,一一加载
- 局限性比较大。
UIImage
*img = [
UIImage
animatedImageNamed
:
@"ship-anim"
duration
:
1
];
self
.
flyImages
.
image = img;
(二)使用UIIamgeView创建动画
- 执行完动画需要手动释放内存。
- 释放图片
- [self.tomImgsperformSelector:@selector(setAnimationImages:)withObject:nilafterDelay:self.tomImgs.animationDuration];
(三)系统动画 UIView
- animation方法的option选项:执行动画的方式
- 1.常规动画属性设置(可以同时选择多个进行设置)
- UIViewAnimationOptionLayoutSubviews //动画过程中保证子视图跟随运动。
- UIViewAnimationOptionAllowUserInteraction //动画过程中允许用户交互。
- UIViewAnimationOptionBeginFromCurrentState //所有视图从当前状态开始运行。
- UIViewAnimationOptionRepeat//重复运行动画。
- UIViewAnimationOptionAutoreverse //动画运行到结束点后仍然以动画方式回到初始点。
- UIViewAnimationOptionOverrideInheritedDuration //忽略嵌套动画时间设置。
- UIViewAnimationOptionOverrideInheritedCurve //忽略嵌套动画速度设置。
- UIViewAnimationOptionAllowAnimatedContent //动画过程中重绘视图(注意仅仅适用于转场动画)。
- UIViewAnimationOptionShowHideTransitionViews //视图切换时直接隐藏旧视图、显示新视图,而不是将旧视图从父视图移除(仅仅适用于转场动画)
- UIViewAnimationOptionOverrideInheritedOptions //不继承父动画设置或动画类型。
- 2.动画速度控制(可从其中选择一个设置)
- UIViewAnimationOptionCurveEaseInOut //动画先缓慢,然后逐渐加速。
- UIViewAnimationOptionCurveEaseIn //动画逐渐变慢。
- UIViewAnimationOptionCurveEaseOut //动画逐渐加速。
- UIViewAnimationOptionCurveLinear //动画匀速执行,默认值。
- 3.转场类型(仅适用于转场动画设置,可以从中选择一个进行设置,基本动画、关键帧动画不需要设置)
- 对应的方法:
- [UIView transitionWithView:待变化的场景duration:动画时间 options:转场动画枚举 animations:block动画代码 completion:nil];
- UIViewAnimationOptionTransitionNone //没有转场动画效果。
- UIViewAnimationOptionTransitionFlipFromLeft //从左侧翻转效果。
- UIViewAnimationOptionTransitionFlipFromRight //从右侧翻转效果。
- UIViewAnimationOptionTransitionCurlUp //向后翻页的动画过渡效果。
- UIViewAnimationOptionTransitionCurlDown //向前翻页的动画过渡效果。
- UIViewAnimationOptionTransitionCrossDissolve //旧视图溶解消失显示下一个新视图的效果。
- UIViewAnimationOptionTransitionFlipFromTop //从上方翻转效果。
- UIViewAnimationOptionTransitionFlipFromBottom //从底部翻转效果。
(四)为程序添加音频
- step1:添加库文件 —— AVFoundation.framework。
- step2:将音频拖入工程,引入AVFoundation头文件
- step3:创建音频对象
NSString
* path = [[
NSBundle
mainBundle
]
pathForResource
:
@"frxz"
ofType
:
@"mp3"
];
NSURL
*url = [
NSURL
fileURLWithPath:path];
//为了延迟音频对象释放的时间,使用属性(强引用)牵制着它
self
.
avplay
= [
AVPlayer
playerWithURL
:url];
//播放
[
self
.
avplay
play
];
(五)Core Animation层面的动画
1.CALayer层(显示的基础)
- UIView的显示功能是依赖底层CALayer实现的
- 每一个UIView包含一个CALayer对象,修改CALayer会影响表现出来的UIView的外观
- UIView可以响应用户事件,是因为继承了UIResponder,而CALayer不可以响应用户事件。
2.Layer的使用
- 重要属性:
- bounds 大小
- position 位置
- anchorPoint 锚点
- 创建新Layer,并将创建好的layer添加到其他layer中
- Layer的种类
- 图片 CALayer
- 给contents属性赋值
- 文字 CATextLayer
- 给string属性赋值
- 绘图 CAShapeLayer
- 给path属性赋值
- 图片 CALayer
3.获取UIView中的CALayer
- 通过【self.view.layer】属性,获取
//
获取
myView
中的
CALayer
属性
CALayer *layer = self . myView . layer ;
layer. backgroundColor = [ UIColor greenColor ]. CGColor ;
// 设置圆角的半径
layer. cornerRadius = 20 ;
// 设置边的颜色
layer. borderColor = [ UIColor redColor ]. CGColor ;
// 设置边宽度
layer. borderWidth = 3 ;
// 一定要设置 默认是 0 透明 看不见
layer. shadowOpacity = 1 ;
// 设置阴影边境
layer. shadowRadius = 10 ;
// 设置阴影颜色
layer. shadowColor = [ UIColor blackColor ]. CGColor ;
// 设置阴影的偏移量
CALayer *layer = self . myView . layer ;
layer. backgroundColor = [ UIColor greenColor ]. CGColor ;
// 设置圆角的半径
layer. cornerRadius = 20 ;
// 设置边的颜色
layer. borderColor = [ UIColor redColor ]. CGColor ;
// 设置边宽度
layer. borderWidth = 3 ;
// 一定要设置 默认是 0 透明 看不见
layer. shadowOpacity = 1 ;
// 设置阴影边境
layer. shadowRadius = 10 ;
// 设置阴影颜色
layer. shadowColor = [ UIColor blackColor ]. CGColor ;
// 设置阴影的偏移量
layer.
shadowOffset
=
CGSizeMake
(
10
,
10);
4.圆形头像效果
效果图:
//
设置
imageView
中的
layer
self . imageView . layer . borderWidth = 3 ;
self . imageView . layer . borderWidth = 3 ;
self
.
imageView
.
layer
.
borderColor
= [
UIColor
redColor
].
CGColor;
//设置圆角的半径为图片长或宽的一半
self
.
imageView
.
layer
.
cornerRadius
=
self
.
imageView
.
bounds
.
size
.
width
*
0.5
;
//削去圆角以外的部分。
self
.
imageView
.
layer
.
masksToBounds
=
YES
;
(六)添加子layer
CALayer
* subLayer = [
CALayer
layer
];
subLayer. backgroundColor = [ UIColor redColor ]. CGColor ;
subLayer. bounds = CGRectMake ( 0 , 0 , 40 , 40 );
subLayer. backgroundColor = [ UIColor redColor ]. CGColor ;
subLayer. bounds = CGRectMake ( 0 , 0 , 40 , 40 );
//
设置锚点
取值范围
0~1
自身的一个点。
//默认是
(0.5
,
0.5),也就是视图的中心点
subLayer.
anchorPoint
=
CGPointMake
(
0
,
0
);
//
设置位置
,
自身在
superLayer
中的位置
//即修改【锚点】在父layer中的位置
subLayer.
position
=
CGPointMake
(
100
,
100
);
// 将【子 layer 】添加到【父 layer 】中
// 将【子 layer 】添加到【父 layer 】中
[
self
.
myView
.
layer
addSublayer
:subLayer];
(七)
CADisplayLink定时器
- 严格意义上讲 CADisplayLink 并不是计时器控件, 它是与显示器刷新频率一致的。比如显示的刷新频率是60赫兹, 那么 CADisplayLink 就会每秒钟执行60次。正是因为这个原因所以有时也把 CADisplayLink 当做计时器控件来使用。
@property
(
strong
,
nonatomic
)
CADisplayLink* link;
-(
CADisplayLink
*)link{
if
(!
_link) {
//
创建一个执行某方法的定制器
//rotation:为自定义的方法
_link
= [
CADisplayLink
displayLinkWithTarget
:
self
selector
:
@selector(rotation:)];
//
把定时器加到主循环中
[
_link
addToRunLoop
:[
NSRunLoop
currentRunLoop
]
forMode
:
NSDefaultRunLoopMode];
//
一开始为暂停
_link
.
paused
=
YES;
}
return
_link
;
}
(八)CAAnimation动画
- CA的动画,只能施加到CALayer上
- CA动画与UIView的区别:
- CA动画是假的,视图看着好像位置改变,但其实数据没有改变
- UIView动画中,明确改变了视图的位置
//创建基础动画对象
CABasicAnimation
* anim = [
CABasicAnimation
animation];
//
设置动画要修改的内容
//
内容:
//
位置
position(点)
//位移 translate
//
大小
scale
// 旋转 rotation
// 使用 KVC 为属性赋值,说明要改的属性名是什么
anim. keyPath = @"position" ;
// 为属性赋值,到达的位置
anim. toValue = [ NSValue valueWithCGPoint : CGPointMake ( 250 , 520 )];
// 为属性赋值,起点的的位置
//anim.fromValue = [NSValue valueWithCGPoint:CGPointMake(250, 520)];
// 持续时间
anim. duration = 2 ;
// 执行次数
anim. repeatCount = 2 ;
/** 固定动画结束时 视图的位置 **/
// 动画结束时,不要把动画从视图上移除
// 保持结束时的状态
anim. removedOnCompletion = NO ;
anim. fillMode = kCAFillModeForwards ;
// 旋转 rotation
// 使用 KVC 为属性赋值,说明要改的属性名是什么
anim. keyPath = @"position" ;
// 为属性赋值,到达的位置
anim. toValue = [ NSValue valueWithCGPoint : CGPointMake ( 250 , 520 )];
// 为属性赋值,起点的的位置
//anim.fromValue = [NSValue valueWithCGPoint:CGPointMake(250, 520)];
// 持续时间
anim. duration = 2 ;
// 执行次数
anim. repeatCount = 2 ;
/** 固定动画结束时 视图的位置 **/
// 动画结束时,不要把动画从视图上移除
// 保持结束时的状态
anim. removedOnCompletion = NO ;
anim. fillMode = kCAFillModeForwards ;
/**
fillMode的取值:
kCAFillModeForwards =
当动画结束时,
layer
保持动画最后的状态
kCAFillModeBackwards = 动画开始前,只需要将动画加入一个 layer , layer 会立即进入动画的初始状态并等待动画开始
kCAFillModeBoth = 以上两个动画效果的集合
kCAFillModeRemoved = 默认值。动画开始前后,动画对 layer 都没有影响。动画结束后, layer 恢复到原来的状态。
*/
// 将动画添加给 layer
kCAFillModeBackwards = 动画开始前,只需要将动画加入一个 layer , layer 会立即进入动画的初始状态并等待动画开始
kCAFillModeBoth = 以上两个动画效果的集合
kCAFillModeRemoved = 默认值。动画开始前后,动画对 layer 都没有影响。动画结束后, layer 恢复到原来的状态。
*/
// 将动画添加给 layer
[
self
.
iamgeView
.
layer
addAnimation
:anim
forKey
:
nil
];
(九)关键帧动画
//
创建关键帧动画的对象
CAKeyframeAnimation * anim = [ CAKeyframeAnimation animation ];
anim. keyPath = @"position" ;
//1. 关键帧,组
anim. values = @[
[ NSValue valueWithCGPoint : CGPointMake ( 100 , 100 )],
[ NSValue valueWithCGPoint : CGPointMake ( 400 , 100 )],
[ NSValue valueWithCGPoint : CGPointMake ( 400 , 400 )],
[ NSValue valueWithCGPoint : CGPointMake ( 100 , 400 )],
[ NSValue valueWithCGPoint : CGPointMake ( 100 , 100 )]
] ;
CAKeyframeAnimation * anim = [ CAKeyframeAnimation animation ];
anim. keyPath = @"position" ;
//1. 关键帧,组
anim. values = @[
[ NSValue valueWithCGPoint : CGPointMake ( 100 , 100 )],
[ NSValue valueWithCGPoint : CGPointMake ( 400 , 100 )],
[ NSValue valueWithCGPoint : CGPointMake ( 400 , 400 )],
[ NSValue valueWithCGPoint : CGPointMake ( 100 , 400 )],
[ NSValue valueWithCGPoint : CGPointMake ( 100 , 100 )]
] ;
//2.
使用贝塞尔对象,绘制矩形,以矩形的四个点作为关键帧顶点运动
anim.
path
= [
UIBezierPath
bezierPathWithRoundedRect
:
CGRectMake
(
100
,
100
,
200
,
200
)
cornerRadius
:
20
].
CGPath
;
// 持续时间
anim. duration = 1 ;
// 执行次数
anim. repeatCount = 1000000000 ;
anim. removedOnCompletion = NO ;
anim. fillMode = kCAFillModeForwards ;
// 持续时间
anim. duration = 1 ;
// 执行次数
anim. repeatCount = 1000000000 ;
anim. removedOnCompletion = NO ;
anim. fillMode = kCAFillModeForwards ;
[
self
.
iamgeView
.
layer
addAnimation
:anim
forKey
:
nil
];
(十)组动画
- 同时设置多个动画效果
//
组动画
-( void )groupAnimation{
// 创建位移的动画
CABasicAnimation * positionAnim = [ CABasicAnimation animation ];
positionAnim. keyPath = @"position.y" ;
positionAnim. toValue = @500 ;
// 动画运行时,速度函数 EaseIn 开始快
positionAnim. timingFunction = [ CAMediaTimingFunction functionWithName : kCAMediaTimingFunctionEaseIn ];
-( void )groupAnimation{
// 创建位移的动画
CABasicAnimation * positionAnim = [ CABasicAnimation animation ];
positionAnim. keyPath = @"position.y" ;
positionAnim. toValue = @500 ;
// 动画运行时,速度函数 EaseIn 开始快
positionAnim. timingFunction = [ CAMediaTimingFunction functionWithName : kCAMediaTimingFunctionEaseIn ];
//
创建一个变形的动画
CABasicAnimation * transformAnim = [ CABasicAnimation animationWithKeyPath : @"transform.rotation.y" ];
transformAnim. toValue = @( M_PI ) ;
transformAnim. timingFunction = [ CAMediaTimingFunction functionWithName : kCAMediaTimingFunctionEaseOut ];
// 创建动画组
CAAnimationGroup * animGroup = [ CAAnimationGroup animation ];
animGroup. animations = @[ positionAnim,transformAnim ] ;
animGroup. duration = 2 ;
animGroup. repeatCount = 10 ;
animGroup. removedOnCompletion = NO ;
animGroup. fillMode = kCAFillModeForwards ;
[ self . iamgeView . layer addAnimation :animGroup forKey : nil ];
CABasicAnimation * transformAnim = [ CABasicAnimation animationWithKeyPath : @"transform.rotation.y" ];
transformAnim. toValue = @( M_PI ) ;
transformAnim. timingFunction = [ CAMediaTimingFunction functionWithName : kCAMediaTimingFunctionEaseOut ];
// 创建动画组
CAAnimationGroup * animGroup = [ CAAnimationGroup animation ];
animGroup. animations = @[ positionAnim,transformAnim ] ;
animGroup. duration = 2 ;
animGroup. repeatCount = 10 ;
animGroup. removedOnCompletion = NO ;
animGroup. fillMode = kCAFillModeForwards ;
[ self . iamgeView . layer addAnimation :animGroup forKey : nil ];
}
总结:CAAnimation的子类
- CABasicAnimation
- 位移、缩放、旋转
- CAKeyframeAnimation
- CAAnimationGroup