[iOS UI进阶 - 6.2] 核心动画CoreAnimation 练习代码

A.基本用法
1.CABasicAnimation
  1 //

  2 //  ViewController.m

  3 //  CoreAnimationTest

  4 //

  5 //  Created by hellovoidworld on 15/1/14.

  6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.

  7 //

  8 

  9 #import "ViewController.h"

 10 

 11 @interface ViewController ()

 12 

 13 @property(nonatomic, strong) CALayer *layer;

 14 

 15 @end

 16 

 17 @implementation ViewController

 18 

 19 - (void)viewDidLoad {

 20     [super viewDidLoad];

 21     // Do any additional setup after loading the view, typically from a nib.

 22    

 23 

 24     CALayer *layer = [[CALayer alloc] init];

 25     layer.bounds = CGRectMake(0, 0, 100, 100);

 26     layer.anchorPoint = CGPointZero;

 27     layer.position = CGPointMake(100, 200);

 28     layer.backgroundColor = [UIColor redColor].CGColor;

 29    

 30     [self.view.layer addSublayer:layer];

 31    

 32     self.layer = layer;

 33 }

 34 

 35 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

 36 //    [self testTransform];

 37    

 38 //    [self testRotation];

 39    

 40 //    [self testScale];

 41    

 42     [self testTranslate];

 43 }

 44 

 45 /** 测试位移转换 */

 46 - (void) testTransform {

 47     // 1.创建动画对象

 48     CABasicAnimation *anim = [CABasicAnimation animation];

 49    

 50     // 2.设置动画

 51     anim.duration = 2.0;

 52     // 动画设置目标属性

 53     anim.keyPath = @"transform.translation.x";

 54     // 目标属性值

 55     anim.toValue = @(150);

 56    

 57     // 完成后保留动画

 58     anim.removedOnCompletion = NO;

 59     // 定格动画模式为最后一刻

 60     anim.fillMode = kCAFillModeForwards;

 61    

 62     // 3.添加动画到图层

 63     [self.layer addAnimation:anim forKey:nil];

 64 }

 65 

 66 /** 测试旋转 */

 67 - (void) testRotation {

 68     // 1.创建动画对象

 69     CABasicAnimation *anim = [CABasicAnimation animation];

 70    

 71     // 2.设置动画

 72     anim.duration = 2.0;

 73    

 74     // 动画设置目标属性

 75 //    anim.keyPath = @"transform.rotation";

 76     anim.keyPath = @"transform";

 77     NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_2, 1, 1, 0)];

 78    

 79     // 目标属性值

 80 //    anim.toValue = @(M_PI_2);

 81     anim.toValue = value;

 82    

 83    

 84     // 完成后保留动画

 85     anim.removedOnCompletion = NO;

 86     // 定格动画模式为最后一刻

 87     anim.fillMode = kCAFillModeForwards;

 88    

 89     // 3.添加动画到图层

 90     [self.layer addAnimation:anim forKey:nil];

 91 }

 92 

 93 /** 测试缩放 */

 94 - (void) testScale {

 95     // 1.创建动画对象

 96     CABasicAnimation *anim = [CABasicAnimation animation];

 97    

 98     // 2.设置动画

 99     anim.duration = 2.0;

100     // 动画设置目标属性

101     anim.keyPath = @"bounds";

102    

103     // 由于属性是bounds,所以x,y属性是无用的,并且要使用CGRect

104     NSValue *fromValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 0, 0)];

105     NSValue *toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 200, 200)];

106    

107     // 目标属性值

108     anim.fromValue = fromValue;

109     anim.toValue = toValue;

110    

111     // 完成后保留动画

112     anim.removedOnCompletion = NO;

113     // 定格动画模式为最后一刻

114     anim.fillMode = kCAFillModeForwards;

115    

116     // 3.添加动画到图层

117     [self.layer addAnimation:anim forKey:nil];

118 }

119 

120 - (void) testTranslate {

121     // 1.创建动画对象

122     CABasicAnimation *anim = [CABasicAnimation animation];

123    

124     // 2.设置动画

125     anim.duration = 2.0;

126     // 动画设置目标属性

127     anim.keyPath = @"position";

128    

129     // 目标属性值

130     NSValue *value = [NSValue valueWithCGPoint:CGPointMake(100, 100)];

131     // 增减目标属性值,所以一直点击就会一直移动下去

132     anim.byValue = value;

133    

134     // 完成后保留动画

135     anim.removedOnCompletion = NO;

136     // 定格动画模式为最后一刻

137     anim.fillMode = kCAFillModeForwards;

138    

139     // 3.添加动画到图层

140     [self.layer addAnimation:anim forKey:nil];

141 }

142 

143 

144 - (void)didReceiveMemoryWarning {

145     [super didReceiveMemoryWarning];

146     // Dispose of any resources that can be recreated.

147 }

148  

149 @end
 
2.CAKeyframeAnimation
CAKeyframeAnimation
 
  1 //

  2 //  KeyframeViewController.m

  3 //  CoreAnimationTest

  4 //

  5 //  Created by hellovoidworld on 15/1/15.

  6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.

  7 //

  8 

  9 #import "KeyframeViewController.h"

 10 

 11 @interface KeyframeViewController ()

 12 

 13 @property(nonatomic, strong) CALayer *layer;

 14 

 15 @end

 16 

 17 @implementation KeyframeViewController

 18 

 19 - (void)viewDidLoad {

 20     [super viewDidLoad];

 21     // Do any additional setup after loading the view.

 22    

 23     CALayer *layer = [[CALayer alloc] init];

 24     layer.bounds = CGRectMake(0, 0, 100, 100);

 25     layer.anchorPoint = CGPointZero;

 26     layer.position = CGPointMake(200, 100);

 27     layer.backgroundColor = [UIColor redColor].CGColor;

 28    

 29     [self.view.layer addSublayer:layer];

 30    

 31     self.layer = layer;

 32 }

 33 

 34 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

 35 //    [self testPath];

 36  

 37     [self testMutiValue];

 38 }

 39 

 40 - (void) testPath {

 41     // 创建动画对象

 42     CAKeyframeAnimation *anim = [[CAKeyframeAnimation alloc] init];

 43    

 44     // 设置动画

 45     anim.keyPath = @"position";

 46     anim.removedOnCompletion = NO;

 47     anim.fillMode = kCAFillModeForwards;

 48     anim.duration = 2.0;

 49    

 50     // 设置绘画路径

 51     CGMutablePathRef path = CGPathCreateMutable();

 52     // 创建一个圆的轨迹

 53     CGPathAddEllipseInRect(path, NULL, CGRectMake(0, 0, 200, 200));

 54     // 设置动画轨迹

 55     anim.path = path;

 56     // 释放路径

 57     CGPathRelease(path);

 58    

 59     // 设置动画代理

 60     anim.delegate = self;

 61    

 62     [self.layer addAnimation:anim forKey:nil];

 63 }

 64 

 65 - (void) testMutiValue {

 66     // 创建动画对象

 67     CAKeyframeAnimation *anim = [[CAKeyframeAnimation alloc] init];

 68    

 69     // 设置动画

 70     anim.keyPath = @"position";

 71     anim.removedOnCompletion = NO;

 72     anim.fillMode = kCAFillModeForwards;

 73     anim.duration = 2.0;

 74    

 75     NSValue *v1 = [NSValue valueWithCGPoint:CGPointMake(0, 0)];

 76     NSValue *v2 = [NSValue valueWithCGPoint:CGPointMake(100, 100)];

 77     NSValue *v3 = [NSValue valueWithCGPoint:CGPointMake(300, 200)];

 78     NSValue *v4 = [NSValue valueWithCGPoint:CGPointMake(120, 50)];

 79    

 80     anim.values = @[v1, v2, v3, v4];

 81    

 82     //  设置动画节奏

 83     // 慢进慢出

 84     anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

 85    

 86     // 设置动画代理

 87     anim.delegate = self;

 88    

 89     [self.layer addAnimation:anim forKey:nil];

 90 }

 91 

 92 #pragma mark - 动画代理方法

 93 /** 动画开始之后 */

 94 - (void)animationDidStart:(CAAnimation *)anim {

 95     NSLog(@"animationDidStart");

 96 }

 97 

 98 /** 动画结束 */

 99 - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {

100     NSLog(@"animationDidStop");

101 }

102 

103 

104 @end
 
3.控件抖动
AnimationShake
 
 1 //

 2 //  ShakeViewController.m

 3 //  CoreAnimationTest

 4 //

 5 //  Created by hellovoidworld on 15/1/15.

 6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.

 7 //

 8 

 9 #import "ShakeViewController.h"

10 

11 @interface ShakeViewController ()

12 

13 @property(nonatomic, strong) UIImageView *imageView;

14 

15 @end

16 

17 @implementation ShakeViewController

18 

19 - (void)viewDidLoad {

20     [super viewDidLoad];

21     // Do any additional setup after loading the view.

22    

23     UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"headImage"]];

24     imageView.frame = CGRectMake(100, 100, 100, 100);

25     self.imageView = imageView;

26    

27     UIButton *startButton = [UIButton buttonWithType:UIButtonTypeSystem];

28     [startButton setTitle:@"开始" forState:UIControlStateNormal];

29     startButton.frame = CGRectMake(50, 50, 40, 50);

30     [startButton addTarget:self action:@selector(startShake) forControlEvents:UIControlEventTouchUpInside];

31    

32     UIButton *stopButton = [UIButton buttonWithType:UIButtonTypeSystem];

33     [stopButton setTitle:@"停止" forState:UIControlStateNormal];

34     stopButton.frame = CGRectMake(150, 50, 40, 50);

35     [stopButton addTarget:self action:@selector(stopShake) forControlEvents:UIControlEventTouchUpInside];

36    

37     [self.view addSubview:imageView];

38     [self.view addSubview:startButton];

39     [self.view addSubview:stopButton];

40 }

41 

42 /** 开始摆动 */

43 - (void) startShake {

44     NSLog(@"start shake");

45    

46     // 创建动画

47     CAKeyframeAnimation *anim = [[CAKeyframeAnimation alloc] init];

48     anim.keyPath = @"transform.rotation";

49     anim.repeatCount = MAXFLOAT;

50     anim.duration = 0.2;

51    

52     // 设置摇摆

53     anim.values = @[@(- (M_PI/180 * 5)), @((M_PI/180 * 5)), @(- (M_PI/180 * 5))];

54   

55     // 定格动画

56     anim.removedOnCompletion = NO;

57     anim.fillMode = kCAFillModeForwards;

58    

59     // 给view加上动画

60     [self.imageView.layer addAnimation:anim forKey:@"shake"];

61 }

62 

63 /** 停止摆动 */

64 - (void) stopShake {

65     NSLog(@"stop shake");

66    

67     [self.imageView.layer removeAnimationForKey:@"shake"];

68 }

69  

70 @end
 
4.过渡效果
AnimationTransition
 
 1 //

 2 //  TransitionViewController.m

 3 //  CoreAnimationTest

 4 //

 5 //  Created by hellovoidworld on 15/1/15.

 6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.

 7 //

 8 

 9 #import "TransitionViewController.h"

10 

11 @interface TransitionViewController ()

12 

13 @property(nonatomic, strong) UIImageView *imageView;

14 

15 @property(nonatomic, assign) int imageIndex;

16 

17 @end

18 

19 @implementation TransitionViewController

20 

21 - (void)viewDidLoad {

22     [super viewDidLoad];

23     // Do any additional setup after loading the view.

24    

25     self.imageIndex = 0;

26     UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"1"]];

27     imageView.frame = CGRectMake(80, 50, 160, 240);

28     self.imageView = imageView;

29    

30     UIButton *startButton = [UIButton buttonWithType:UIButtonTypeSystem];

31     [startButton setTitle:@"上一张" forState:UIControlStateNormal];

32     startButton.frame = CGRectMake(50, 400, 80, 50);

33     [startButton addTarget:self action:@selector(preImage) forControlEvents:UIControlEventTouchUpInside];

34    

35     UIButton *stopButton = [UIButton buttonWithType:UIButtonTypeSystem];

36     [stopButton setTitle:@"下一张" forState:UIControlStateNormal];

37     stopButton.frame = CGRectMake(150, 400, 80, 50);

38     [stopButton addTarget:self action:@selector(nextImage) forControlEvents:UIControlEventTouchUpInside];

39    

40     [self.view addSubview:imageView];

41     [self.view addSubview:startButton];

42     [self.view addSubview:stopButton];

43 }

44 

45 /** 上一张 */

46 - (void) preImage {

47     NSLog(@"preImage");

48    

49     self.imageIndex--;

50     if (self.imageIndex == -1) {

51         self.imageIndex = 8;

52     }

53    

54     CATransition *anim = [[CATransition alloc] init];

55     anim.duration = 0.5;

56     anim.type = @"cube";

57     anim.subtype = kCATransitionFromLeft;

58    

59     [self.imageView.layer addAnimation:anim forKey:nil];

60    

61     [self changeImage:self.imageIndex];

62 }

63 

64 /** 下一张 */

65 - (void) nextImage {

66     NSLog(@"nextImage");

67    

68     self.imageIndex++;

69     if (self.imageIndex == 9) {

70         self.imageIndex = 0;

71     }

72    

73     CATransition *anim = [[CATransition alloc] init];

74     anim.duration = 0.5;

75     anim.type = @"cube";

76     anim.subtype = kCATransitionFromRight;

77    

78     [self.imageView.layer addAnimation:anim forKey:nil];

79    

80     [self changeImage:self.imageIndex];

81 }

82 

83 /** 替换图片 */

84 - (void) changeImage:(int) imageIndex {

85     NSString *imageName = [NSString stringWithFormat:@"%d", self.imageIndex + 1];

86     self.imageView.image = [UIImage imageNamed:imageName];

87 }

88 

89 @end
 
5.CAAnimationGroup 动画组(组合多种动画)
AnimationGroup
 
 1 //

 2 //  GroupViewController.m

 3 //  CoreAnimationTest

 4 //

 5 //  Created by hellovoidworld on 15/1/15.

 6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.

 7 //

 8 

 9 #import "GroupViewController.h"

10 

11 @interface GroupViewController ()

12 

13 @property(nonatomic, strong) UIView *hvwView;

14 

15 @end

16 

17 @implementation GroupViewController

18 

19 - (void)viewDidLoad {

20     [super viewDidLoad];

21     // Do any additional setup after loading the view.

22    

23     UIView *hvwView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];

24     hvwView.backgroundColor = [UIColor redColor];

25     self.hvwView = hvwView;

26    

27     [self.view addSubview:hvwView];

28 }

29 

30 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

31     // 平移

32     CABasicAnimation *anim1 = [[CABasicAnimation alloc] init];

33     anim1.keyPath = @"position";

34     anim1.toValue = [NSValue valueWithCGPoint:CGPointMake(200, 300)];

35    

36     // 旋转

37     CABasicAnimation *anim2 = [[CABasicAnimation alloc] init];

38     anim2.keyPath = @"transform.rotation";

39     anim2.toValue = @(M_PI_2);

40    

41     // 缩放

42     CABasicAnimation *anim3 = [[CABasicAnimation alloc] init];

43     anim3.keyPath = @"bounds";

44     anim3.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 200, 200)];

45    

46     // group动画

47     CAAnimationGroup *animGroup = [[CAAnimationGroup alloc] init];

48     animGroup.animations = @[anim1, anim2, anim3];

49     animGroup.duration = 2.0;

50    

51     // 定格动画

52     animGroup.removedOnCompletion = NO;

53     animGroup.fillMode = kCAFillModeForwards;

54    

55     [self.hvwView.layer addAnimation:animGroup forKey:nil];

56 }

57  

58 @end

 

 
 

你可能感兴趣的:(animation)