108 lines
2.5 KiB
Objective-C
108 lines
2.5 KiB
Objective-C
//
|
|
// ZZCountingLabel.m
|
|
// 动画测试
|
|
//
|
|
// Created by 周兴 on 2017/6/29.
|
|
// Copyright © 2017年 周兴. All rights reserved.
|
|
//
|
|
|
|
#import "ZZCountingLabel.h"
|
|
|
|
@interface ZZCountingLabel ()
|
|
|
|
@property (nonatomic, strong) CADisplayLink *playLink;
|
|
@property (nonatomic, assign) NSInteger displayPerSecond;
|
|
|
|
@property (nonatomic, assign) CGFloat fromValue;
|
|
@property (nonatomic, assign) CGFloat toValue;
|
|
|
|
@property (nonatomic, assign) CGFloat increaseValue;
|
|
@property (nonatomic, assign) CGFloat perValue;
|
|
|
|
@end
|
|
|
|
@implementation ZZCountingLabel
|
|
|
|
- (instancetype)init {
|
|
if (self = [super init]) {
|
|
[self initValues];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (instancetype)initWithFrame:(CGRect)frame {
|
|
if (self = [super initWithFrame:frame]) {
|
|
[self initValues];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)awakeFromNib {
|
|
[super awakeFromNib];
|
|
[self initValues];
|
|
}
|
|
|
|
- (void)initValues {
|
|
_duration = 2.0;
|
|
_displayPerSecond = 30;
|
|
}
|
|
|
|
- (void)countingFrom:(CGFloat)fromValue to:(CGFloat)toValue {
|
|
[self countingFrom:fromValue to:toValue duration:_duration];
|
|
}
|
|
|
|
- (void)countingFrom:(CGFloat)fromValue to:(CGFloat)toValue duration:(CGFloat)duration {
|
|
|
|
_fromValue = fromValue;
|
|
_toValue = toValue;
|
|
_duration = duration;
|
|
|
|
_increaseValue = _fromValue;
|
|
_perValue = (_toValue - _fromValue)/(_duration==0?1:(_displayPerSecond*_duration));
|
|
|
|
if (self.playLink) {
|
|
[self.playLink invalidate];
|
|
self.playLink = nil;
|
|
}
|
|
|
|
CADisplayLink *playLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(countingAction)];
|
|
if (@available(iOS 10.0, *)) {
|
|
playLink.preferredFramesPerSecond = _displayPerSecond;
|
|
} else {
|
|
playLink.frameInterval = 60/(_displayPerSecond==0?1:_displayPerSecond);
|
|
}
|
|
|
|
[playLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
|
|
[playLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:UITrackingRunLoopMode];
|
|
self.playLink = playLink;
|
|
|
|
}
|
|
|
|
- (void)countingAction {
|
|
_increaseValue += _perValue;
|
|
|
|
if (_fromValue < _toValue) {
|
|
if (_increaseValue >= _toValue) {
|
|
[self stopDisplayLink];
|
|
}
|
|
} else {
|
|
if (_increaseValue <= _toValue) {
|
|
[self stopDisplayLink];
|
|
}
|
|
}
|
|
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
self.text = [NSString stringWithFormat:@"%.0f%%",_increaseValue];
|
|
});
|
|
}
|
|
|
|
- (void)stopDisplayLink {
|
|
|
|
[self.playLink invalidate];
|
|
self.playLink = nil;
|
|
|
|
_increaseValue = _toValue;
|
|
}
|
|
|
|
@end
|