属性动画的常用方法属性
属性动画:通过改变图层绘制视图上面的属性值(支持动画的属性)产生的动画。
1、初始化
+ (instancetype)animationWithKeyPath:(nullable NSString *)path
path:需要产生动画的属性
例如:改变中心点会移动
2、keyPath->描述动画的属性
可以产生动画的属性:
transform.scale = 比例转换
transform.scale.x
transform.scale.y
transform.rotation.z
opacity = 透明度
zPosition
backgroundColor 背景颜色
cornerRadius 拐角
borderWidth 边框的宽度
bounds
contents 内容
contentsRect
cornerRadius
frame
hidden
masksToBounds
opacity
position
shadowColor
shadowOffset
shadowOpacity
shadowRadius
基础动画
CABasicAnimation:基础动画
介绍:通过改变某个属性的值到某一个值->只能设置两个值
frameValue:开始值,如果不设置不会返回到初始位置
toValue:结束值
byValue:通过哪个值
CAAnimation:核心动画,是所有动画的父类
1、CAMediaTiming媒体时间类协议,核心动画关于时间类的控制,是遵守了CAMediaTiming中的协议内容
1.beginTime 动画开始的时间默认为0
2.duration:动画持续时间,默认为0,持续时间受速度的影响,实际动画完成时间 =持续时间/速度
3.speed动画播放的速度默认为1速度设置成0可以暂停动画 speed2秒 duration60秒
动画真正播放完成的时间 30秒
4.timeOffset
动画播放时间的偏移量
5.repeatCount动画的循环次数
默认是0只播放一次
6.repeatDuration
动画循环的持续时间
只能设置其中的一个属性
repeatCount/repeatDuration
7.autoreverses:是否以动画的形式返回到播放之前的状态
8.fillMode设置当前对象在非活动时间段的状态
要想fillMode有效需设置removedOnCompletion = NO
kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态
kCAFillModeBackwards 立即进入动画的初始状态并等待动画开始
kCAFillModeBoth动画加入后开始之前 layer处于动画初始状态动画结束后layer保持动画最后的状态
kCAFillModeRemoved 默认值动画结束后 layer会恢复到之前的状态
2、CAAnimation动画属性方法介绍
(1)初始化:animation
(2)timingFunction速度控制类,控制动画运行节奏
(3)removedOnCompletion动画完成的术后,是否移除动画效果
(4)delegate
代理方法
timingFunction 速度控制类 控制动画运行的节奏
初始化:functionWithName:
kCAMediaTimingFunctionLinear 匀速
kCAMediaTimingFunctionEaseIn 慢进快出
kCAMediaTimingFunctionEaseOut 快进慢出
kCAMediaTimingFunctionEaseInEaseOut慢进慢出中间加速
kCAMediaTimingFunctionDefault 默认
#import "ViewController.h"
@interface ViewController ()
//背景
@property (nonatomic,strong) CALayer *layer;
//花瓣
@property (nonatomic,strong) CALayer *petalLayer;
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
self.view.backgroundColor = [UIColorwhiteColor];
self.edgesForExtendedLayout =UIRectEdgeNone;
[self.view.layeraddSublayer:self.layer];
[self.view.layeraddSublayer:self.petalLayer];
}
- (CALayer *)petalLayer{
if (_petalLayer) {
return_petalLayer;
}
_petalLayer = [CALayerlayer];
_petalLayer.position =CGPointMake(self.view.center.x,50);
UIImage *image =[UIImageimageNamed:@"fly_1"];
_petalLayer.bounds =CGRectMake(0,0, image.size.width/5, image.size.height/5);
_petalLayer.contents = (id)image.CGImage;
return_petalLayer;
}
- (CALayer *)layer{
if (_layer) {
return_layer;
}
_layer = [CALayerlayer];
_layer.position =CGPointMake(self.view.center.x,self.view.center.y+100);
UIImage *image =[UIImageimageNamed:@"心"];
_layer.bounds =CGRectMake(0,0, image.size.width/10, image.size.height/10);
_layer.contents = (id)image.CGImage;
return_layer;
}
//移动中心点
- (void)demo1:(CGPoint)toValue{
CABasicAnimation *animation = [CABasicAnimationanimationWithKeyPath:@"position"];
// CGPoint -> 转id
// NSValue -> NSValue
animation.fromValue = [NSValuevalueWithCGPoint:self.petalLayer.position];
animation.toValue = [NSValuevalueWithCGPoint:toValue];
// CAMdediaTiming——>duration动画的持续时间
animation.duration =3;
// 动画执行的总时间受动画速度的影响
animation.speed =2;
// 设置动画在完成的时候,固定在完成状态,这个属性必须把removedOnCompletion设置成NO,才会有效果
animation.removedOnCompletion =NO;
animation.fillMode =kCAFillModeBoth;
// 速度控制
// 设置成快进慢出
animation.timingFunction = [CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionEaseOut];
// layer -> addAnimation :添加动画
// Animation:动画
// forKey 表示动画的字符串,可以通过key来找到这个动画
[self.petalLayeraddAnimation:animation forKey:@"可以通过这个key,找到此动画"];
// 查找某个key对应的动画
// CABasicAnimation *an = [self.petalLayer animationForKey:@"可以通过这个key,找到此动画"];
}
/*
- (CABasicAnimation *)moveAnimation{
if (_moveAnimation) {
return _moveAnimation;
}
_moveAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
// CGPoint -> 转id
// CGPoint -> NSValue
_moveAnimation.fromValue = [NSValue valueWithCGPoint:self.petalLayer.position];
_moveAnimation.toValue = [NSValue valueWithCGPoint:toValue];
return _moveAnimation;
}
*/
- (void)dome2{
self.view.backgroundColor = [UIColorwhiteColor];
UIImage *image = [UIImageimageNamed:@"心"];
self.layer.contents = (id)image.CGImage;
self.layer.bounds =CGRectMake(0,0,image.size.width/10, image.size.height/10);
CABasicAnimation *animation = [CABasicAnimationanimationWithKeyPath:@"bounds"];
/*
1、放大后还原到原来的位置,以动画的方法
2、先慢后快
3、一直循环
*/
animation.fromValue = [NSValuevalueWithCGRect:self.layer.bounds];
animation.toValue = [NSValuevalueWithCGRect:CGRectMake(0,0, image.size.width/7, image.size.height/7)];
animation.repeatCount =HUGE;
animation.duration =0.5;
// 以动画的效果,还原到开始的状态
animation.autoreverses =YES;
animation.timingFunction = [CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionEaseIn];
[self.view.layeraddAnimation:animation forKey:@"heartJamp"];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// [self demo1:[[touches anyObject] ]];
[selfdome2];
}