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

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

时间: 2024-11-03 05:42:58

使用CADisplayLink写秒表的相关文章

用js写一个秒表

首先,先铺好格式 <input type="text" name="" id="shuzi" value="00:00:00" /><br /> <input onclick="ks()" type="button" name="" id="kaishi" value="开始" /> <

Core Animation系列之CADisplayLink

http://blog.csdn.net/wzzvictory/article/details/22417181 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/22417181 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微博.微信公众帐号wangzzstrive来支持我,谢谢! 一直以来都想好好学习下CoreAnimation,奈何涉及的东西太多,想要一次性全部搞定时间上不允许,以后会断断续续的补全.

CADisplayLink以及和NSTimer的区别

什么是CADisplayLink CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器.我们在应用中创建一个新的 CADisplayLink 对象,把它添加到一个runloop中,并给它提供一个 target 和selector 在屏幕刷新的时候调用. 一但 CADisplayLink 以特定的模式注册到runloop之后,每当屏幕需要刷新的时候,runloop就会调用CADisplayLink绑定的target上的selector,这时target可以读到 

10.1 单片机数字秒表程序

不同数据类型间的相互转换 在 C 语言中,不同数据类型之间是可以混合运算的.当表达式中的数据类型不一致时,首先转换为同一种类型,然后再进行计算.C 语言有两种方法实现类型转换,一是自动类型转换,另外一种是强制类型转换.这块内容是比较繁杂的,因此我们根据常用的编程应用来讲部分相关内容. 当不同数据类型之间混合运算的时候,不同类型的数据首先会转换为同一类型,转换的主要原则是:短字节的数据向长字节数据转换.比如: unsigned char a; unsigned int b; unsigned in

iOS动画进阶 - 手摸手教你写 Slack 的 Loading 动画

如果移动端访问不佳,可以访问我的个人博客 前几天看了一篇关于动画的博客叫手摸手教你写 Slack 的 Loading 动画,看着挺炫,但是是安卓版的,寻思的着仿造着写一篇iOS版的,下面是我写这个动画的分解~ 老规矩先上图和demo地址: 刚看到这个动画的时候,脑海里出现了两个方案,一种是通过drawRect画出来,然后配合CADisplayLink不停的绘制线的样式:第二种是通过CAShapeLayer配合CAAnimation来实现动画效果.再三考虑觉得使用后者,因为前者需要计算很多,比较复

数码管实验——简易秒表

秒表的制作并非一帆风顺,中间遇到了许多问题 比如计数寄存器的位数设置 reg     [?:0]    c1; 参考别人的代码写为31了,虽然最后成功了,但却不知道原因... 基础Verilog知识还是有待学习啊~‘ 最终代码: //======================================================= // This code is generated by Terasic System Builder //=======================

基于 CADisplayLink 的 FPS 指示器详解

前言 之前在开发中有使用到计时器NSTimer,后来了解到iOS中不同的计时方法,其中就包括了CADisplayLink.基于CADisplayLink以屏幕刷新频率同步绘图的特性,尝试根据这点去实现一个可以观察屏幕当前帧数的指示器. 结论在前 根据CADisplayLink所实现的FPS指示器在实际生产场景下只有指导意义,不能代表真实的FPS,具体原因见下文. 什么是CADisplayLink CADisplayLink是CoreAnimation提供的另一个类似于NSTimer的类,它总是在

秒表功能实现

秒表要实现的功能描写叙述:下方灰色背景的view上有两个button-開始/停止button 和 计次button.点击開始button,中间的大时钟開始计时,这时点击计次button.右上角的小时钟会把此刻的瞬时时间记录下来.同一时候在以下的tableView上也会显示. 点击停止button会把右上角的小时钟,中间的大时钟清零.同一时候,以下的tableView也会清空. 效果图例如以下:        详细代码实现: #import "MiaoBiaoViewController.h&qu

CADisplayLink

什么是CADisplayLink CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器.我们在应用中创建一个新的 CADisplayLink 对象,把它添加到一个runloop中,并给它提供一个 target 和selector 在屏幕刷新的时候调用. 一但 CADisplayLink 以特定的模式注册到runloop之后,每当屏幕需要刷新的时候,runloop就会调用CADisplayLink绑定的target上的selector,这时target可以读到