使用CADisplayLink写秒表
效果:
源码:
StopWatch.h 与 StopWatch.m
//
// StopWatch.h
// ShowTime
//
// Created by YouXianMing on 14-10-16.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
//
#import <Foundation/Foundation.h>
@protocol StopWatchDelegate <NSObject>
- (void)stopWatchDate:(NSDate *)date;
@end
// 说明:此秒表类是基于CADisplayLink所写,每一帧刷新一次
@interface StopWatch : NSObject
@property (nonatomic, assign) id<StopWatchDelegate> delegate;
- (void)start; // 开始
- (void)stop; // 停止
- (void)reset; // 复位
- (NSDate *)gainDate; // 获取时间(只有在start的时候获取时间才有意义,stop之后返回值为0)
@end
//
// StopWatch.m
// ShowTime
//
// Created by YouXianMing on 14-10-16.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
//
#import "StopWatch.h"
@interface StopWatch ()
@property (nonatomic, strong) CADisplayLink *countDownTimer;
@property (nonatomic, strong) NSDate *startDate;
@property (nonatomic, strong) NSDate *pausedDate;
@property (nonatomic, assign) BOOL startFlag;
@end
@implementation StopWatch
- (void)start {
_startFlag = YES;
if (_countDownTimer) {
[_countDownTimer invalidate];
_countDownTimer = nil;
}
if (_countDownTimer == nil) {
if(_startDate == nil) {
_startDate = [NSDate date];
}
if(_pausedDate != nil){
NSTimeInterval countedTime = [_pausedDate timeIntervalSinceDate:_startDate];
_startDate = [[NSDate date] dateByAddingTimeInterval:-countedTime];
_pausedDate = nil;
}
_countDownTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(timerRunEvent)];
_countDownTimer.frameInterval = 1;
[_countDownTimer addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}
}
- (void)stop {
_startFlag = NO;
if (_countDownTimer) {
[_countDownTimer invalidate];
_countDownTimer = nil;
_pausedDate = [NSDate date];
}
}
- (void)reset {
_pausedDate = nil;
_startDate = [NSDate date];
if (_delegate) {
NSTimeInterval currentToSpecifyDuration = [[[NSDate alloc] init] timeIntervalSinceDate:_startDate];
NSDate *date = [NSDate dateWithTimeIntervalSince1970:currentToSpecifyDuration];
[_delegate stopWatchDate:date];
}
}
- (NSDate *)gainDate {
if (_startFlag) {
NSTimeInterval currentToSpecifyDuration = [[[NSDate alloc] init] timeIntervalSinceDate:_startDate];
NSDate *date = [NSDate dateWithTimeIntervalSince1970:currentToSpecifyDuration];
return date;
} else {
return nil;
}
}
- (void)timerRunEvent {
if (_delegate) {
NSTimeInterval currentToSpecifyDuration = [[[NSDate alloc] init] timeIntervalSinceDate:_startDate];
NSDate *date = [NSDate dateWithTimeIntervalSince1970:currentToSpecifyDuration];
[_delegate stopWatchDate:date];
}
}
- (void)dealloc {
NSLog(@"xxxxxx");
}
@end
注意:富文本显示的秒表并不是这个类的功能而已:)