效果图:

代码

//
//  LHTimerViewController.swift
//  safari
//
//  Created by 磊怀王 on 2019/12/4.
//  Copyright © 2019 磊怀王. All rights reserved.
//import UIKitclass LHTimerViewController: UIViewController {override func viewDidLoad() {super.viewDidLoad()self.view.backgroundColor = UIColor.whiteself.navigationItem.title = "计时器"// Do any additional setup after loading the viewself.createViews()self.timeMethon()}var labArr : [UILabel] = Array.init()fileprivate weak var _targetObj : AnyObject!func createViews() -> Void {var i = 1let midArr : [String] = ["时","分","秒"]let lab_w = 30let lab_h = 30let lab_y = 100while i < 10 {let lab : UILabel = UILabel.init()lab.textAlignment = NSTextAlignment.centerif i % 3 == 0 {lab.frame = CGRect.init(x: 30 + (lab_w * 2 + 20) * (i / 3) + (i / 3 - 1) * (lab_w * 2 / 3 + 10), y: lab_y + (lab_h / 2 - lab_h / 2 / 2), width: lab_w * 2 / 3, height: lab_h / 2)lab.text = midArr[i / 3 - 1]lab.textColor = UIColor.purplelab.font = UIFont.systemFont(ofSize: 15.0)}else{lab.frame = CGRect.init(x: 30 + (lab_w + 10) * (i - 1 - (i / 3)) + (i / 3) * (lab_w * 2 / 3 + 10), y: lab_y, width: lab_w, height: lab_h)lab.text = "0"lab.textColor = UIColor.whitelab.backgroundColor = UIColor.blacklab.font = UIFont.systemFont(ofSize: 18.0)labArr.append(lab)}self.view.addSubview(lab)i += 1}let btnArr : [String] = ["开始","暂停","重置"]for objc in btnArr.enumerated() {let btn = UIButton.init(type: UIButton.ButtonType.custom)btn.frame = CGRect.init(x: objc.offset * (60 + 10) + 60, y: lab_y + lab_h + 10, width: 60, height: 30)btn.setTitle(btnArr[objc.offset], for: UIControl.State.normal)btn.titleLabel?.font = UIFont.systemFont(ofSize: 15)btn.backgroundColor = UIColor.blackbtn.setTitleColor(UIColor.white, for: UIControl.State.normal)self.view.addSubview(btn)btn.tag = 100 + objc.offsetbtn.addTarget(self, action: #selector(btnClick(_:)), for: UIControl.Event.touchUpInside)}}@objc func btnClick(_ btn : UIButton) -> Void {print("\(btn.tag)")switch btn.tag {case 100:print("begin")
//            self.timer?.fireDate = Date.init(timeIntervalSinceNow: 5) // 5 秒后开始执行self.timer?.fireDate = Date.distantPastbreakcase 101:print("parse")self.timer?.fireDate = Date.distantFuturebreakcase 102:print("reset")self.timer?.fireDate = Date.distantFuturesecond = 0let sixLab = labArr[5]let fiveLab = labArr[4]let fourLab = labArr[3]let threeLab = labArr[2]let secLab = labArr[1]let firstLab = labArr[0]sixLab.text = "0"fiveLab.text = "0"fourLab.text = "0"threeLab.text = "0"secLab.text = "0"firstLab.text = "0"breakdefault:break}}var timer : Timer? = nilfunc timeMethon() -> Void {self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timeAction(_:)), userInfo: nil, repeats: true)RunLoop.current.add(self.timer!, forMode: RunLoop.Mode.common)self.timer?.fireDate = Date.distantFuture}var second : Int = 3 * 3600  + 59 * 60 + 32@objc func timeAction(_ time : Timer) -> Void {second += 1let sixLab = labArr[5]let fiveLab = labArr[4]let fourLab = labArr[3]let threeLab = labArr[2]let secLab = labArr[1]let firstLab = labArr[0]if second >= 0 && second < 24 * 60 * 60 {let h = second / 3600secLab.text = "\(h % 10)"firstLab.text = "\(h / 10)"let min = second % 3600fourLab.text = "\(min / 60 % 10)"threeLab.text = "\(min / 60 / 10)"fiveLab.text = "\(min % 60 / 10)"sixLab.text = "\(min % 60 % 10)"}else{sixLab.text = "围"fiveLab.text = "范"fourLab.text = "出"threeLab.text = "超"secLab.text = "间"firstLab.text = "时"time.fireDate = Date.distantFuture}}override func viewWillAppear(_ animated: Bool) {self.tabBarController?.tabBar.isHidden = true}override func viewWillDisappear(_ animated: Bool) {self.tabBarController?.tabBar.isHidden = false}override func didMove(toParent parent: UIViewController?) {if parent == nil {self.timer?.invalidate()self.timer = nil}}deinit {print(" LHTimerViewController被释放了")}/*// MARK: - Navigation// In a storyboard-based application, you will often want to do a little preparation before navigationoverride func prepare(for segue: UIStoryboardSegue, sender: Any?) {// Get the new view controller using segue.destination.// Pass the selected object to the new view controller.}*/}

注意计时器的销毁以及controller 释放

这样的销毁方式,以及 target 方式会出现,app前后台切换导致的计时器不准的现象(非常明显)。 下篇博客说明一下。

我是磊怀 2849765859 是我QQ 欢迎联系我

swift 计时器timer相关推荐

  1. java中GUI中显示当前时间_javaGUI界面实现动态时间显示——Swing中的计时器Timer

    在Java中要实现时间的动态显示有不少种方法.下面就介绍其中一种简单的方法给你们.java Swing中的计时器Timer,主要用到javax.swing.*包下的Timer类,该类能够周期的触发Ac ...

  2. android计时器代码百度网盘下载,计时器timer app下载

    计时器timer安卓最新版可以很好的进行时间管理,还可以模拟时钟表盘,支持静音操作,按照时间的设定会出现表盘逐渐消失的特效,提高自己的专注力,可以自定义设置白噪音,喜爱的朋友赶快下载体验吧! 官方介绍 ...

  3. Java计时器Timer和TimerTask用法总结(源码)

    在家学技术实在是不好坚持,心里老是想给自己放个假,但是现在俺又太菜,又想赶赶技术.前天做一个五子棋程序, 遇到了计时器功能的需求,但是这个我没用过,就总结一下吧,不过虽然是会用了,但是和swing的代 ...

  4. .net中计时器Timer类

    计时器可以一种定时的方式异步的重复运行,这里简单的讲解举例一下System.Threading命名空间中的Timer类. 参考文档:https://msdn.microsoft.com/zh-cn/l ...

  5. Android 计时器Timer,时间格式化以时分秒显示

    在开发中我们有时会有这样的需求,即在固定的每隔一段时间执行某一个任务.比如UI上的控件需要随着时间改变,我们可以使用Java为我们提供的计时器的工具类,即Timer和TimerTask. API Ti ...

  6. 高性能计时器Timer的设计(时间轮和时间堆两种方式)

    时间轮 前文提到,基于排序链表的定时器存在一个问题:添加定时器的效率偏低.一种简单的时间轮如图所示: 在这个时间轮中,实线指针指向轮子上的一个槽(slot).它以恒定的速度顺时针转动,每转动一步就指向 ...

  7. 安卓计时器timer的使用

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  8. C# 计时器实现方法及计时器Timer控件,倒计时

    借鉴帖子:https://blog.csdn.net/u013658041/article/details/78203931 system.Timers命名空间下的Timer类,使用Elapsed事件 ...

  9. HTML5游戏引擎(十五)-时间控制——Timer计时器 Ticker心跳-startTick-stopTick 帧事件-ENTER_FRAME

    HTML5游戏引擎(十五)-时间控制--Timer计时器 & Ticker心跳-startTick-stopTick & 帧事件-ENTER_FRAME 时间控制 Timer计时器 假 ...

最新文章

  1. centOS怎样强制卸载PHP以及自定义安装PHP
  2. UA MATH564 概率论 Dirichlet分布
  3. HDMI_VGA_CBVS同时显示
  4. Kubernetes用户指南(二)--部署组合型的应用、连接应用到网络中
  5. Chromium Android编译指南
  6. C#LeetCode刷题-程序员面试金典
  7. 应用悄悄拿走你的隐私做了什么?只需30秒这个AI给你答案
  8. NPOI自定义单元格背景颜色
  9. Spring mvc 拦截器 配置心得
  10. 编程入门知识c语言,C语言编程学习入门基础知识有哪些?
  11. 二叉排序树、AVL树、红黑树、B树、B+树、Hash树、
  12. JAVA滁州市住房公积金管理中心网站计算机毕业设计Mybatis+系统+数据库+调试部署
  13. 全国计算机等级AJIL,全国计算机二级VB知识点2015第一次课
  14. 数据库分析之逻辑结构设计
  15. Day23JavaSE——多线程实现
  16. 2022 最新版前端工程师面试题手册
  17. 广联达软件股份有限公司
  18. C/C++试题检测一下自己的编码技能
  19. java控制台输出颜色设置
  20. MySQL 服务正在启动 MySQL 服务无法启动解决途径

热门文章

  1. mysql的高可用方案-PXC方案(综合各方的资料)
  2. 倍福PLC--实现Dword数据类型每位1的计数,即统计类型中“1”的位数
  3. 5.不确定性推理方法: 可信度方法, 证据理论
  4. FFmpeg使用X264编码参数
  5. 网络未能解析服务器名,未能解析此远程名称局域网服务器
  6. 分类Classification:决策树Decision Tree
  7. 南开大学计算机考研历年分数线,南开大学计算机科学与技术考研历年分数线报录比及导师信息...
  8. 邦纳LTF12KC2LDQ激光传感器
  9. Spring Boot之Log4j2配置(总结)
  10. 灰度共生矩阵(GLCM)的概念及其相关特征