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

注意:富文本显示的秒表并不是这个类的功能而已:)
目录
相关文章
|
8月前
|
图形学
|
9月前
【单片机期中测试】9.定时器实现简单的秒表程序
【单片机期中测试】9.定时器实现简单的秒表程序
124 0
|
5月前
|
Python
|
9月前
|
算法 Java 测试技术
精准计时工具:深入了解 Stopwatch(计时器)
在计算机编程领域中,精确计时是一个关键的需求,特别是在性能优化、算法分析等场景下。Stopwatch,作为一个用于测量时间间隔的工具,可以帮助开发者精确地计时代码的执行时间。在本文中,我们将详细介绍 Stopwatch 的特性、用法以及在实际应用中的优势。
369 0
setInterval与clearInervar实现秒表功能
setInterval与clearInervar实现秒表功能
|
SQL 芯片
数字式秒表电路设计
数字式秒表电路设计
128 1
数字式秒表电路设计
|
传感器 存储 编解码
基于单片机定时闹钟设计
基于单片机定时闹钟设计
161 0
基于单片机定时闹钟设计
|
芯片
数电实验 数字电子钟设计 基于quartus 实现计时校时闹钟秒表稍复杂音频 分享电路图设计以及工程文件
数电实验 数字电子钟设计 基于quartus 实现计时校时闹钟秒表稍复杂音频 分享电路图设计以及工程文件
1099 1
数电实验 数字电子钟设计 基于quartus 实现计时校时闹钟秒表稍复杂音频 分享电路图设计以及工程文件
w2 有秒计时的数字时钟
题目内容: 这一周的编程题是需要你在课程所给的时钟程序的基础上修改而成。但是我们并不直接给你时钟程序的代码,请根据视频自己输入时钟程序的Display和Clock类的代码,然后来做这个题目。
1181 0
|
程序员 Go
如何1秒钟让程序员抖腿?教你10个方法!
最近又继续搜搜罗不少好听的BGM(BackGround Music,都是电音,尤其是游戏背景音乐必备),希望大家喜欢!这些歌曲都可以在网易云中直接搜索获得。
1419 0