You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
2.8 KiB
115 lines
2.8 KiB
// |
|
// UILabel+BezierAnimation.m |
|
// Test |
|
// |
|
// Created by senro wang on 15/8/11. |
|
// Copyright (c) 2015年 王燊. All rights reserved. |
|
// |
|
|
|
#import "UILabel+BezierAnimation.h" |
|
#import "WSBezier.h" |
|
|
|
#define KMaxTimes 50 |
|
|
|
|
|
@implementation UILabel (BezierAnimation) |
|
|
|
NSMutableArray *totlePoints; //记录所有的点。 |
|
|
|
WSBezier *bezier; //通过 改变bezier 函数的参数 (也就是 四个 控制点)可以改变动画的样式 - |
|
|
|
float _duration; // 动画 间隔 |
|
float _fromNum; |
|
float _toNum; |
|
|
|
|
|
|
|
float _lastTime; //记录每一个点的 时刻 |
|
|
|
int _index; |
|
|
|
//- (instancetype)initWithFrame:(CGRect)frame{ |
|
// |
|
// if (self = [super initWithFrame:frame]) { |
|
// |
|
// [self _initBezier]; |
|
// [self _cleanVars]; |
|
// } |
|
// |
|
// return self; |
|
//} |
|
|
|
|
|
- (void)_cleanVars{ |
|
|
|
_lastTime = 0; |
|
_index = 0; |
|
self.text = @"0"; |
|
|
|
} |
|
|
|
|
|
//初始化 控制点 |
|
- (void)_initBezier{ |
|
|
|
|
|
bezier = [[WSBezier alloc] init]; |
|
} |
|
|
|
|
|
- (void)animationFromnum:(float)fromNum toNum:(float)toNum duration:(float)duration precision:(NSString*)precision{ |
|
[self _initBezier]; |
|
[self _cleanVars]; |
|
|
|
_duration = duration; |
|
_fromNum = fromNum; |
|
_toNum = toNum; |
|
|
|
|
|
totlePoints = [NSMutableArray array]; |
|
float dt = 1.0 / (KMaxTimes - 1); |
|
for (NSInteger i = 0; i < KMaxTimes; i ++ ) { |
|
|
|
WSPoint point = [bezier pointWithdt:dt * i]; |
|
|
|
|
|
float currTime = point.x * _duration; |
|
float currValue = point.y * (_toNum - _fromNum) + _fromNum; |
|
|
|
NSArray *array = [NSArray arrayWithObjects:[NSNumber numberWithFloat:currTime] , [NSNumber numberWithFloat:currValue], nil]; |
|
[totlePoints addObject:array]; |
|
|
|
} |
|
|
|
[self changeNumberNoBySelectorWithPrecision:precision]; |
|
|
|
} |
|
- (void)changeNumberNoBySelectorWithPrecision:(NSString*)precision { |
|
if (_index>= KMaxTimes) { |
|
if([precision containsString:@"d"]){ |
|
self.text = [NSString stringWithFormat:precision,(int)_toNum]; |
|
}else{ |
|
self.text = [NSString stringWithFormat:precision,_toNum]; |
|
} |
|
return; |
|
} else { |
|
NSArray *pointValues = [totlePoints objectAtIndex:_index]; |
|
_index++; |
|
float value = [(NSNumber *)[pointValues objectAtIndex:1] floatValue]; |
|
float currentTime = [(NSNumber *)[pointValues objectAtIndex:0] floatValue]; |
|
float timeDuration = currentTime - _lastTime; |
|
_lastTime = currentTime; |
|
if([precision containsString:@"d"]){ |
|
self.text = [NSString stringWithFormat:precision,(int)value]; |
|
}else{ |
|
self.text = [NSString stringWithFormat:precision,value]; |
|
} |
|
|
|
[self performSelector:@selector(changeNumberNoBySelectorWithPrecision:) withObject:precision afterDelay:timeDuration]; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
@end
|
|
|