CABasicAnimation动画

CABasicAnimation是基于CALayer的动画,有各种形式的动画,这种动画已经趋于底层了,所以灵活性很强。
添加CoreGraphics.framework,QuartzCore.framework,类库。
延展,可在视频的layer层增加一些动画或者贴纸:

#import <Foundation/Foundation.h>
//
#if defined(NS_STRING_ENUM)  // Available starting in Xcode 8.0.
#define SRICKER_STRING_ENUM NS_STRING_ENUM
#else
#define SRICKER_STRING_ENUM
#endif
typedef NSString *StickerAnimationType SRICKER_STRING_ENUM;
typedef NS_ENUM(NSInteger, StickerTransformLocal) {
    StickerTransformAll,///x.y
    StickerTransformX,  ///x.
    StickerTransformY,     ///y.
    StickerTransformZ,    ///z.
};
@interface StickerDefault : NSObject
 
//透明度
extern StickerAnimationType const StickerAnimationByOpacity;
//位置
extern StickerAnimationType const StickerAnimationByPosition;
//变形
extern StickerAnimationType const StickerAnimationByTransform;
//缩放
extern StickerAnimationType const StickerAnimationByTransformScale;
//旋转
extern StickerAnimationType const StickerAnimationByTransformRotation;
//大小
extern StickerAnimationType const StickerAnimationByBounds;
@end
//
//  CALayer+Animation.h
//  MRCTestDemo
//
//  Created by Admin on 2018/4/11.
//  Copyright © 2018年 LianDongTech. All rights reserved.
//
 
#import <QuartzCore/QuartzCore.h>
#import <AVFoundation/AVFoundation.h>
#import <UIKit/UIKit.h>
#import "StickerDefault.h"
 
@interface CALayer (Animation)
//透明
- (void)opacityAnimationFromValue:(CGFloat)fromValue toValue:(CGFloat)tovalue repeatCount:(float)repeatCount duration:(float)duration;
//旋转
- (void)rotation:(float)duration fromValue:(CGFloat)fromValue toValue:(CGFloat)toValue direction:(StickerTransformLocal)local repeatCount:(float)repeatCount;
//缩放
- (void)scale:(float)duration fromValue:(CGFloat)fromValue toValue:(CGFloat)toValue direction:(StickerTransformLocal)local repeatCount:(float)repeatCount;
//大小
- (void)boundsFromRect:(CGRect)fromRect toRect:(CGRect)toRect atDuration:(float)duration AtDirectionLocal:(StickerTransformLocal)local repeatCount:(float)repeatCount;
//位置
- (void)position:(CGPoint)point degree:(float)degree direction:(StickerTransformLocal)local repeatCount:(float)repeatCount;
//变换
- (void)transform:(float)duration fromValue:(CATransform3D)fromValue toValue:(CATransform3D)toValue repeatCount:(float)repeatCount;
@end
//
//  CALayer+Animation.m
//  MRCTestDemo
//
//  Created by Admin on 2018/4/11.
//  Copyright © 2018年 LianDongTech. All rights reserved.
//
 
#import "CALayer+Animation.h"
 
@implementation CALayer (Animation)
 
- (void)opacityAnimationFromValue:(CGFloat)fromValue toValue:(CGFloat)tovalue repeatCount:(float)repeatCount duration:(float)duration
{
    CABasicAnimation *animation=[CABasicAnimation animationWithKeyPath:StickerAnimationByOpacity];
    //动画时间
    animation.duration=duration;
    //动画重复次数
    animation.repeatCount=repeatCount;
    //回退动画
    //animation.autoreverses=YES;
    //保存动画后的效果
    animation.removedOnCompletion = NO;
    animation.fillMode = kCAFillModeForwards;
    // animate from fully visible to invisible
    animation.fromValue=[NSNumber numberWithFloat:fromValue];
    animation.toValue=[NSNumber numberWithFloat:tovalue];
    animation.beginTime = AVCoreAnimationBeginTimeAtZero;
    [self addAnimation:animation forKey:@"animateOpacity"];
}
 
- (void)rotation:(float)duration fromValue:(CGFloat)fromValue toValue:(CGFloat)toValue direction:(StickerTransformLocal)local repeatCount:(float)repeatCount
{
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:[self finalLocalStickerAnimationType:StickerAnimationByTransformRotation stickerTransformLocal:local]];
    animation.duration = duration;
    animation.repeatCount = repeatCount;
    animation.removedOnCompletion = NO;
    animation.fillMode = kCAFillModeForwards;
//    animation.autoreverses=YES;
    // rotate from 0 to 360
    animation.fromValue=[NSNumber numberWithFloat:fromValue];
    //toValue=2.0为360度
    animation.toValue=[NSNumber numberWithFloat:(toValue * M_PI)];
    animation.beginTime = AVCoreAnimationBeginTimeAtZero;
    [self addAnimation:animation forKey:@"animateRotation"];
}
 
- (void)scale:(float)duration fromValue:(CGFloat)fromValue toValue:(CGFloat)toValue direction:(StickerTransformLocal)local repeatCount:(float)repeatCount
{
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:[self finalLocalStickerAnimationType:StickerAnimationByTransformScale stickerTransformLocal:local]];
    animation.duration = duration;
    animation.repeatCount = repeatCount;
//    animation.autoreverses=YES;
    animation.removedOnCompletion = NO;
    animation.fillMode = kCAFillModeForwards;
    // animate from half size to full size
    animation.fromValue=[NSNumber numberWithFloat:fromValue];
    animation.toValue=[NSNumber numberWithFloat:toValue];
    animation.beginTime = AVCoreAnimationBeginTimeAtZero;
    [self addAnimation:animation forKey:@"animateScale"];
}
 
- (void)boundsFromRect:(CGRect)fromRect toRect:(CGRect)toRect atDuration:(float)duration AtDirectionLocal:(StickerTransformLocal)local repeatCount:(float)repeatCount
{
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:[self finalLocalStickerAnimationType:StickerAnimationByBounds stickerTransformLocal:local]];
    animation.duration = duration;
    animation.repeatCount = repeatCount;
    //    animation.autoreverses=YES;
    animation.removedOnCompletion = NO;
    animation.fillMode = kCAFillModeForwards;
    // animate from half size to full size
    animation.fromValue=[NSValue valueWithCGRect:fromRect];
    animation.toValue=[NSValue valueWithCGRect:toRect];
    animation.beginTime = AVCoreAnimationBeginTimeAtZero;
    [self addAnimation:animation forKey:@"animateBounds"];
}
 
 
- (void)position:(CGPoint)point degree:(float)degree direction:(StickerTransformLocal)local repeatCount:(float)repeatCount
{
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:[self finalLocalStickerAnimationType:StickerAnimationByPosition stickerTransformLocal:local]];
    animation.duration = degree;
    animation.repeatCount = repeatCount;
    //    animation.autoreverses=YES;
    animation.removedOnCompletion = NO;
    animation.fillMode = kCAFillModeForwards;
    // animate from half size to full size
    animation.fromValue = [NSValue valueWithCGPoint:self.position];
    animation.toValue=[NSValue valueWithCGPoint:point];
    animation.beginTime = AVCoreAnimationBeginTimeAtZero;
    [self addAnimation:animation forKey:@"animatePosition"];
}
 
//CATransform3D 
- (void)transform:(float)duration fromValue:(CATransform3D)fromValue toValue:(CATransform3D)toValue repeatCount:(float)repeatCount
{
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:StickerAnimationByTransform];
    animation.duration = duration;
    animation.repeatCount = repeatCount;
    //    animation.autoreverses=YES;
    animation.removedOnCompletion = NO;
    animation.fillMode = kCAFillModeForwards;
    // animate from half size to full size
    animation.fromValue = [NSValue valueWithCATransform3D:fromValue];
    animation.toValue=[NSValue valueWithCATransform3D:toValue];
    animation.beginTime = AVCoreAnimationBeginTimeAtZero;
    [self addAnimation:animation forKey:@"animatePosition"];
}
 
//
- (NSString *)finalLocalStickerAnimationType:(StickerAnimationType)type stickerTransformLocal:(StickerTransformLocal)local
{
    
    NSArray *types = @[type,
               [NSString stringWithFormat:@"%@.x",type],
               [NSString stringWithFormat:@"%@.y",type],
               [NSString stringWithFormat:@"%@.z",type],
               ];
    return (NSString *)types[local];
    
}
 
@end

Demo下载地址:https://pan.baidu.com/s/1Y4z_0beor9Ba8TPIFWbFGw

Leave a Reply

Required fields are marked *