1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
//
// UIView+LikeAnimation.m
// test
//
// Created by wangyang on 16/9/21.
// Copyright © 2016年 北京更美互动信息科技有限公司. All rights reserved.
//
#import "UIView+LikeAnimation.h"
@implementation UIView (LikeAnimation)
- (void)addLikeAnimationWithFrame:(CGRect)frame {
UIImageView *likeView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"topic_zan_pink"]];
likeView.frame = frame;
[likeView addLikeAnimationFrom:likeView.center];
[self addSubview:likeView];
}
- (void)addLikeAnimationFrom:(CGPoint)point {
CGFloat totalTime = 1;
// 放大
CABasicAnimation *scaleBig = [CABasicAnimation animationWithKeyPath:@"transform"];
scaleBig.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
scaleBig.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(2.5, 2.5, 1.0)];
scaleBig.removedOnCompletion = YES;
scaleBig.beginTime = 0;
scaleBig.duration = 0.5 * totalTime;
scaleBig.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
// 缩小
CABasicAnimation *scaleSmall = [CABasicAnimation animationWithKeyPath:@"transform"];
scaleSmall.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(2.5, 2.5, 1.0)];
scaleSmall.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(1.5, 1.5, 1.0)];
scaleSmall.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
scaleSmall.removedOnCompletion = YES;
scaleSmall.beginTime = 0.5 * totalTime;
scaleSmall.duration = 0.5 * totalTime;
// 渐隐
CABasicAnimation *alphaAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
alphaAnimation.fromValue = @1;
alphaAnimation.toValue = @0.25;
alphaAnimation.removedOnCompletion = YES;
alphaAnimation.beginTime = 0.5 * totalTime;
alphaAnimation.duration = 0.5 * totalTime;
// 旋转
CABasicAnimation *rotate =
[CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotate.fromValue = [NSNumber numberWithFloat:0]; // 开始时的角度
rotate.toValue = [NSNumber numberWithFloat:M_PI_4]; // 结束时的角度
rotate.beginTime = 0;
rotate.duration = 0.5 * totalTime;
rotate.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
rotate.removedOnCompletion = NO;
rotate.fillMode = kCAFillModeForwards;
// 路径
UIBezierPath *movePath = [UIBezierPath bezierPath];
[movePath moveToPoint:point];
[movePath addQuadCurveToPoint:CGPointMake(point.x + 35, point.y - 43) controlPoint:CGPointMake(point.x + 27, point.y - 115)];
CAKeyframeAnimation * posAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
posAnim.path = movePath.CGPath;
posAnim.removedOnCompletion = YES;
// 组合动画
CAAnimationGroup *group = [CAAnimationGroup animation];
group.animations = [NSArray arrayWithObjects:scaleBig, scaleSmall, posAnim, rotate, alphaAnimation, nil];
group.duration = 1 * totalTime;
group.autoreverses = NO;
group.repeatCount = 1;
[self.layer addAnimation:group forKey:nil];
[self performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:1 * totalTime inModes:[NSArray arrayWithObject:NSRunLoopCommonModes]];
}
@end