iOS 动画组

  其实早在一个多月以前就已经实现了动作组播放的功能,不过当时感觉好像没有什么难度并没有放在心上,今天突然要用到动画组,发现已经忘记了,所以又将原来的代码翻出来看了下。最后决定还是写下来,以备不时之需。动画组播放很简单,使用的是CAAnimationGroup这个类,将不同的动画添加到里面进行播放。通常可以添加的动画有:1、keyPath,它用来绘制路径,直线或者曲线,从理论上讲任意的线都可以绘制;2、旋转动画,它可以绕x、y、z轴进行旋转;3、缩放动画。

  废话不多说,直接上代码。

  

 1 #define pathAnimation @"position"
 2 #define transformX @"transform.rotation.x"
 3 #define transformY @"transform.rotation.y"
 4 #define transformZ @"transform.rotation.z"
 5 #define scaleAnimation @"position scale"
 6 #import <Foundation/Foundation.h>
 7 #import <QuartzCore/QuartzCore.h>
 8 #import <UIKit/UIKit.h>
 9 
10 //NSString *const pathAnimation = @"position";          //运动轨迹
11 //NSString *const transformX = @"transform.rotation.x"; //绕x轴旋转
12 //NSString *const transformY = @"transform.rotation.y"; //绕y轴旋转
13 //NSString *const transformZ = @"transform.rotation.z"; //绕z轴旋转
14 //NSString *const scaleAnimation = @"position scale";   //缩放
15 
16 typedef enum AnimationType{
17     KeyPathAnimation,      //运动轨迹为抛物线
18     RotationAnimationX,    //绕x轴旋转
19     RotationAnimationY,    //绕y轴旋转
20     RotationAnimationZ,    //绕z轴旋转
21     ScaleAnimation         //缩放
22 }AnimationType;
23 
24 @protocol LMFThowingLineToolDelegate <NSObject>
25 
26 - (void)animationDidFinish;
27 
28 @end
29 
30 @interface LMFThowingLineTool : NSObject
31 @property (nonatomic, strong) NSMutableArray *typeArray;//用来存储动画类型
32 @property (nonatomic, strong) NSArray *pointArray;
33 @property (nonatomic, strong) CAKeyframeAnimation *keyFrameAnimation;
34 @property (nonatomic, strong) CABasicAnimation *basicAnimation;
35 @property (nonatomic, strong) UIView *showView;
36 @property (nonatomic, assign) CGFloat duration;
37 @property (nonatomic, assign) id<LMFThowingLineToolDelegate> delegate;
38 - (void)setPointArray:(NSArray *)pointArray;
39 - (void)setDuration:(CGFloat)duration;
40 - (void)setKeyFrameAnimation;
41 - (void)setBasicAnimationWith:(AnimationType)animationType;
42 - (void)thowingView:(UIView *)view;
43 - (void)setTransform:(CGFloat)angle and:(AnimationType)animationType;
44 @end

  实现类:

 

  1 #import "LMFThowingLineTool.h"
  2 #import "LMFPoint.h"
  3 
  4 @interface LMFThowingLineTool ()
  5 
  6 @end
  7 
  8 @implementation LMFThowingLineTool
  9 
 10 - (void)dealloc
 11 {
 12     self.basicAnimation = nil;
 13     self.keyFrameAnimation = nil;
 14     NSLog(@"%@", self.basicAnimation);
 15 }
 16 
 17 - (instancetype)init
 18 {
 19     if (self = [super init])
 20     {
 21         self.typeArray = [NSMutableArray array];
 22     }
 23     return self;
 24 }
 25 - (void)setPointArray:(NSArray *)pointArray
 26 {
 27     _pointArray = pointArray;
 28 }
 29 - (void)setDuration:(CGFloat)duration
 30 {
 31     _duration = duration;
 32 }
 33 - (void)setKeyFrameAnimation
 34 {
 35     if ([self.pointArray count] == 0)
 36     {
 37         return;
 38     }
 39     CGMutablePathRef path = CGPathCreateMutable();
 40     
 41     if ([self.pointArray count] == 3)
 42     {
 43         LMFPoint * startPoint = (LMFPoint *)self.pointArray[0];
 44         LMFPoint * centerPoint = (LMFPoint *)self.pointArray[1];
 45         LMFPoint * endPoint = (LMFPoint *)self.pointArray[2];
 46         CGPathMoveToPoint(path, NULL, startPoint.x, startPoint.y);
 47         //这里用的直线的路径,也可以设置抛物线,获取曲线,可进行自定义
 48         CGPathAddQuadCurveToPoint(path, NULL, centerPoint.x, centerPoint.y, endPoint.x, endPoint.y);
 49     }
 50     else if ([self.pointArray count] > 3)
 51     {
 52         return;
 53     }
 54     self.keyFrameAnimation = [CAKeyframeAnimation animationWithKeyPath:pathAnimation];
 55     self.keyFrameAnimation.path = path;
 56     CFRelease(path);
 57     [self.typeArray addObject:self.keyFrameAnimation];
 58 }
 59 - (void)setTransform:(CGFloat)angle and:(AnimationType)animationType
 60 {
 61     
 62 }
 63 - (void)setBasicAnimationWith:(AnimationType)animationType
 64 {
 65     self.basicAnimation = [[CABasicAnimation alloc] init];
 66     self.basicAnimation.autoreverses = YES;
 67     self.basicAnimation.repeatCount = MAXFLOAT;
 68     self.basicAnimation.duration = self.duration;
 69     switch (animationType) {
 70         case RotationAnimationX:
 71             self.basicAnimation.keyPath = transformX;
 72             break;
 73         case RotationAnimationY:
 74             self.basicAnimation.keyPath = transformY;
 75             break;
 76         case RotationAnimationZ:
 77             self.basicAnimation.keyPath = transformZ;
 78             break;
 79         case ScaleAnimation:
 80             self.basicAnimation.keyPath = scaleAnimation;
 81             self.basicAnimation.toValue = [NSNumber numberWithFloat:(CGFloat)((arc4random() % 4) + 4) / 10.0];
 82             [self.typeArray addObject:self.basicAnimation];
 83             break;
 84         default:
 85             break;
 86     }
 87     self.basicAnimation.fromValue = [NSNumber numberWithFloat:0.0];
 88     int intNumber = arc4random()%3+1;
 89     self.basicAnimation.toValue = [NSNumber numberWithFloat:intNumber*M_PI];
 90     [self.typeArray addObject:self.basicAnimation];
 91 }
 92 
 93 #pragma mark --开始执行动画
 94 - (void)thowingView:(UIView *)view
 95 {
 96     self.showView = view;
 97     CAAnimationGroup *groupAnimation = [CAAnimationGroup animation];
 98 //    groupAnimation.delegate = self;
 99     groupAnimation.repeatCount = 1;
100     groupAnimation.duration = self.duration;
101     groupAnimation.removedOnCompletion = NO;
102     groupAnimation.animations = self.typeArray;
103     [view.layer addAnimation:groupAnimation forKey:@"position scale"];
104 }
105 
106 - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
107 {
108     [self.showView removeFromSuperview];
109     self.showView = nil;
110 }
111 
112 @end

  额外需要的类:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface LMFPoint : NSObject
@property (nonatomic, assign) CGFloat x;
@property (nonatomic, assign) CGFloat y;
- (instancetype)initWith:(CGFloat)x and:(CGFloat)y;
@end

#import "LMFPoint.h"

@implementation LMFPoint
- (instancetype)initWith:(CGFloat)x and:(CGFloat)y
{
    if (self = [super init])
    {
        self.x = x;
        self.y = y;
    }
    return self;
}

- (NSString *)description
{
    return [NSString stringWithFormat:@"x:%f   y:%f", self.x, self.y];
}

@end

 

posted @ 2016-10-24 17:01  照顾一下  阅读(218)  评论(0编辑  收藏  举报