使用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 = ;
[_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
注意:富文本显示的秒表并不是这个类的功能而已:)
使用CADisplayLink写秒表的更多相关文章
- JavaScript写秒表
1.HTML部分 <div id="div1"> <span id="hour">00</span> <span> ...
- 利用纯代码写出一个秒表表盘的方法 —— #DF
@interface ViewController () @property (nonatomic, strong) CALayer *secLayer; // 秒针layer @property ( ...
- CADisplayLink以及和NSTimer的区别
什么是CADisplayLink CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器.我们在应用中创建一个新的 CADisplayLink 对象,把它添加到一个r ...
- iOS开发中深入理解CADisplayLink和NSTimer
一.什么是CADisplayLink 简单地说,它就是一个定时器,每隔几毫秒刷新一次屏幕. CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器.我们在应用中创建一 ...
- Core Animation系列之CADisplayLink
一直以来都想好好学习下CoreAnimation,奈何涉及的东西太多,想要一次性全部搞定时间上不允许,以后会断断续续的补全.最近项目里用到了CADisplayLink,就顺便花点时间看了看. 一.简介 ...
- C# 一个简单的秒表引发的窗体卡死问题
一个秒表程序也是我的一个心病,因为一直想写这样的一个东西,但是总往GUI那边想,所以就比较怵,可能是上学的时候学MFC搞出的后遗症吧,不过当我今天想好用Win Form(话说还是第一次写win for ...
- CADisplayLink
什么是CADisplayLink CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器.我们在应用中创建一个新的 CADisplayLink 对象,把它添加到一个r ...
- Android(java)学习笔记134:Handler用法总结 和 秒表案例
一.Handler的定义: Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用.比如可以用handler发送一个message,然后在handler的线程中 ...
- Core Animation系列之CADisplayLink(转)
转自 http://www.tuicool.com/articles/meMVR3 一直以来都想好好学习下CoreAnimation,奈何涉及的东西太多,想要一次性全部搞定时间上不允许,以后会断断续续 ...
随机推荐
- Inno Setup设置在安装Finished页面,点击finish后打开网页
在安装的最后一个页面FinishPage中点击Finished然后打开一个网页 这个功能貌似很简单,不就是在点击finish按钮给它绑定事件,问题立马解决. 在普通的桌面应用程序开发中的确是这样做的, ...
- 转:Java8内存模型—永久代(PermGen)和元空间(Metaspace)
一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 1.虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建.栈里面存着的是一种叫“栈 ...
- ABP实战--分页排序
待完成... public async Task<DatatablesResultDto<TaskDto>> GetList(KeywordDatatablesRequestD ...
- Android设计原则和设计模式
1. 设计模式的六大基本原则 1.0 总结: 因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定.而软件中易变的细节,我们用从抽象派生的实现类来进行扩展,当软件需要发生变化时,我们 ...
- [转].Net实现本地化简易教程
本文转自:https://www.cnblogs.com/csdbfans/archive/2011/10/17/2214048.html 实现多语言版本的支持,就是所谓的国际化,也说是本地化. 今天 ...
- [转] Hadoop管理员的十个最佳实践
前言 接触Hadoop有两年的时间了,期间遇到很多的问题,既有经典的NameNode和JobTracker内存溢出故障,也有HDFS存储小文件问题,既有任务调度问题,也有MapReduce性能问题.遇 ...
- Node.js Cookie管理
Cookie 管理 我们可以使用中间件向 Node.js 服务器发送 cookie 信息,以下代码输出了客户端发送的 cookie 信息: var express=require('express') ...
- Python__组合数据类型
组合数据:集合类型.序列类型(元组类型.列表类型).字典类型 集合: 定义:集合是多个元素的无序组合.(无序,唯一,Python中要求放入集合中的数据类型是不可变的). 集合用大括号 {}表示,元素间 ...
- 使用phpQuery轻松采集网页内容
phpQuery是一个基于PHP的服务端开源项目,它可以让PHP开发人员轻松处理DOM文档内容,比如获取某新闻网站的头条信息.更有意思的是,它采用了jQuery的思想,你可以像使用jQuery一样处理 ...
- [javaSE] 集合框架(TreeSet)
TreeSet:可以对Set集合中的元素排序,默认按照ascii表排序,二叉树结构 左边叉是小的,右边叉是大的 存储自定义对象 定义一个类Student实现Comparable类,使自定义类具备比较性 ...