使用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
注意:富文本显示的秒表并不是这个类的功能而已:)