[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"];

最全面的动画案例

https://github.com/YouXianMing/Animations

results matching ""

    No results matching ""