forked from YouXianMing/EasingAnimation
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathYXEasing.m
86 lines (71 loc) · 2.69 KB
/
YXEasing.m
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
81
82
83
84
85
86
//
// YXEasing.m
// Prize
//
// Copyright (c) 2014年 Y.X. All rights reserved.
//
#import "YXEasing.h"
@implementation YXEasing
+ (NSArray *)calculateFrameFromValue:(CGFloat)fromValue
toValue:(CGFloat)toValue
func:(AHEasingFunction)func
frameCount:(size_t)frameCount
{
// 设置帧数量
NSMutableArray *values = [NSMutableArray arrayWithCapacity:frameCount];
// 计算并存储
CGFloat t = 0.0;
CGFloat dt = 1.0 / (frameCount - 1);
for(size_t frame = 0; frame < frameCount; ++frame, t += dt)
{
// 此处就会根据不同的函数计算出不同的值达到不同的效果
CGFloat value = fromValue + func(t) * (toValue - fromValue);
// 将计算结果存储进数组中
[values addObject:[NSNumber numberWithFloat:(float)value]];
}
// 数组中存储的数据为 NSNumber float 型
return values;
}
+ (NSArray *)calculateFrameFromPoint:(CGPoint)fromPoint
toPoint:(CGPoint)toPoint
func:(AHEasingFunction)func
frameCount:(size_t)frameCount
{
// 设置帧数量
NSMutableArray *values = [NSMutableArray arrayWithCapacity:frameCount];
// 计算并存储
CGFloat t = 0.0;
CGFloat dt = 1.0 / (frameCount - 1);
for(size_t frame = 0; frame < frameCount; ++frame, t += dt)
{
// 此处就会根据不同的函数计算出不同的值达到不同的效果
CGFloat x = fromPoint.x + func(t) * (toPoint.x - fromPoint.x);
CGFloat y = fromPoint.y + func(t) * (toPoint.y - fromPoint.y);
// 将计算结果存储进数组中
[values addObject:[NSValue valueWithCGPoint:CGPointMake(x, y)]];
}
// 数组中存储的数据为 NSValue CGPoint 型
return values;
}
+ (NSArray *)calculateFrameFromSize:(CGSize)fromSize
toSize:(CGSize)toSize
func:(AHEasingFunction)func
frameCount:(size_t)frameCount
{
// 设置帧数量
NSMutableArray *values = [NSMutableArray arrayWithCapacity:frameCount];
// 计算并存储
CGFloat t = 0.0;
CGFloat dt = 1.0 / (frameCount - 1);
for(size_t frame = 0; frame < frameCount; ++frame, t += dt)
{
// 此处就会根据不同的函数计算出不同的值达到不同的效果
CGFloat w = fromSize.width + func(t) * (toSize.width - fromSize.width);
CGFloat h = fromSize.height + func(t) * (toSize.height - fromSize.height);
// 将计算结果存储进数组中
[values addObject:[NSValue valueWithCGSize:CGSizeMake(w, h)]];
}
// 数组中存储的数据为 NSValue CGSize 型
return values;
}
@end