[TOC]
㈡CAAnimation
CAAnimation是一个抽象类,遵循了CAMediaTiming协议和CAAction协议!我们不要直接使用CAAnimation类,而是使用其子类:
主要有三大子类:
- 转场动画:CATranstion
- 属性动画:CAPropertyAnimation及其子类
- 组合动画:CAAnimationGroup
@interface CAAnimation : NSObject <@protocol CAMediaTiming, @protocol CAAction>
@protocol CAAnimationDelegate <NSObject>
//上面的类定义了动画共有属性和方法!
//1.转场动画:提供渐变效果,如推拉push效果,消退fade效果,揭开reveal效果
@interface CATransition : CAAnimation
//2.属性动画:通常不直接使用,而是使用子类
@interface CAPropertyAnimation : CAAnimation
//基本属性动画:提供了对单一动画的实现,比如位置从A到B,然后就会移动过去。
@interface CABasicAnimation : CAPropertyAnimation
//关键桢动画,可以定义动画路线,例如在A和B之间,会根据一定的算法布一些位置。
@interface CAKeyframeAnimation : CAPropertyAnimation
@interface CASpringAnimation : CABasicAnimation //弹簧动画
//3.组合动画:允许多个动画同时播放
@interface CAAnimationGroup : CAAnimation
Api_CAAnimation
// 提供所有动画最基本的设置。
@interface CAAnimation : NSObject
<@protocol CAMediaTiming, @protocol CAAction> //遵循了CAMediaTiming协议和CAAction协议
@protocol CAAnimationDelegate <NSObject> ////监控动画开始和停止
////////////////////////////
@interface CAAnimation : NSObject
+ (instancetype)animation; //创建对象
@property(nullable, strong) CAMediaTimingFunction *timingFunction;
//设置动画变化的步调样式:Linear, EaseIn...
//关于CAMediaTimingFunction类,主要通过+functionWithName:方法来创建系统已经提供的样式。
//创建系统已经提供的样式
@interface CAMediaTimingFunction : NSObject <NSCoding>
+ (instancetype)functionWithName:(NSString *)name;
CA_EXTERN NSString * const kCAMediaTimingFunctionLinear; // 线性动画
CA_EXTERN NSString * const kCAMediaTimingFunctionEaseIn; // 快速进入动画
CA_EXTERN NSString * const kCAMediaTimingFunctionEaseOut;// 快速出来动画
CA_EXTERN NSString * const kCAMediaTimingFunctionEaseInEaseOut;//快速进入出来动画
CA_EXTERN NSString * const kCAMediaTimingFunctionDefault; //默认动画是curve动画,曲线动画
//创建按贝塞尔曲线的路径动画,要用这两个方法来创建
+ (instancetype)functionWithControlPoints:(float)c1x :(float)c1y :(float)c2x :(float)c2y;
- (instancetype)initWithControlPoints:(float)c1x :(float)c1y :(float)c2x :(float)c2y;
- (void)getControlPointAtIndex:(size_t)idx values:(float[2])ptr;
@end
@property(getter=isRemovedOnCompletion) BOOL removedOnCompletion;
//当动画完成时,如果希望动画自动移除,设置YES,默认值为YES。如果想要循环或者执行多次动画,设置为NO。
@property(nullable, strong) id <CAAnimationDelegate> delegate;
+ (nullable id)defaultValueForKey:(NSString *)key;
- (BOOL)shouldArchiveValueForKey:(NSString *)key;
@end
//监控动画
@protocol CAAnimationDelegate <NSObject>
@optional
//动画开始时的回调
- (void)animationDidStart:(CAAnimation *)anim;
//动画停止的回调,可以通过flag判断动画是否是完成还是暂停
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;
@end
两个重要协议:
CAMediaTiming
//这个协议是用于配置动画的相关属性的。
@protocol CAMediaTiming
@property CFTimeInterval beginTime; //动画的开始时间,默认为0
@property CFTimeInterval timeOffset; //当前播放的进度
@property CFTimeInterval duration; //整个动画的总时长
@property float speed; //动画的播放速度,默认为1,若设置为2,则以两倍的速度播放; 如果设置小于1,则相当于慢放。
@property float repeatCount; //动画播放次数, 默认为0表示只播放一次;设置为HUGE_VALF表示无限制播放次数
@property CFTimeInterval repeatDuration; //重复播放的动画时长,不要与repeatCount混合使用
@property BOOL autoreverses; //是否回放
@property(copy) NSString *fillMode; //设置动画完成时的动作
//fillMode' options.
CA_EXTERN NSString * const kCAFillModeForwards; //当动画结束后,layer会一直保持着动画最后的状态
CA_EXTERN NSString * const kCAFillModeBackwards; //这个和kCAFillModeForwards是相对的,就是在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始.
CA_EXTERN NSString * const kCAFillModeBoth;//上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态.
CA_EXTERN NSString * const kCAFillModeRemoved; //这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态
@end
CAAction
//这个协议只有一个方法,我们可以调用此方法来触发指定的事件,这样接收者就可以接收到代理。
@protocol CAAction
- (void)runActionForKey:(NSString *)event object:(id)anObject arguments:(nullable NSDictionary *)dict;
@end
//e.g.
-(void)runActionForKey:(NSString *)event object:(id)anObject arguments:(NSDictionary *)dict{
NSLog(@"runActionForKey:\"%@\" object:%@ arguments:%@", event, anObject, dict);
CATransition *anim=nil;
if([event isEqualToString:@"test"]){
anim=[CATransition animation];
anim.duration=2;
anim.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
anim.type=@"cube";
anim.subtype=kCATransitionFromRight;
}
[(CALayer*)anObject addAnimation:anim forKey:@"contets"];
}
////触发runActionForKey
//添加自定义的action以及对应的触发方法所在的代理,应该可以定义一个动画子类(CAAnimation)
layer1.actions = [NSDictionary dictionaryWithObjectsAndKeys:[[FCLayerDelegate alloc]init], @"test", nil];
//实际触发的地方,当设置test参数,其实最后触发的是runActionForKey种的立方体旋转
[layer1 setValue:[NSNumber numberWithInt:19] forKey:@"test"];