使用CADisplayLink写秒表

简介:

使用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

注意:富文本显示的秒表并不是这个类的功能而已:)

目录
相关文章
|
4月前
51开发板同一程序实现数码管实现时钟显示、秒表计时。通过独立按键选择模式(时钟/秒表)、时间的重定义
51开发板同一程序实现数码管实现时钟显示、秒表计时。通过独立按键选择模式(时钟/秒表)、时间的重定义
130 3
|
4月前
|
C语言
【51单片机】LCD1602显示字符串,时间、时间+按键校准、秒表计时的功能代码。
【51单片机】LCD1602显示字符串,时间、时间+按键校准、秒表计时的功能代码。
|
4月前
【51单片机】通过定时器中断 在8位数码管显示时间
【51单片机】通过定时器中断 在8位数码管显示时间
|
4月前
|
算法
51单片机不用定时器的数码管倒计时
51单片机不用定时器的数码管倒计时
【单片机期中测试】9.定时器实现简单的秒表程序
【单片机期中测试】9.定时器实现简单的秒表程序
150 0
【单片机期中测试】10.利用定时器实现pwm呼吸灯
【单片机期中测试】10.利用定时器实现pwm呼吸灯
146 0
|
SQL 芯片
数字式秒表电路设计
数字式秒表电路设计
202 1
数字式秒表电路设计