Swift实现倒计时5秒功能
更新时间:2020年6月30日 23:37 点击:2561
一般在项目的“引导页”有个功能,倒计时5秒结束后,然后可以允许用户点击跳过按钮跳过引导页。同样在“登录”和“注册”页面也有类似功能,发送验证码后,计时60秒后才允许用户再次请求重新发送验证码。
计时方式一(sleep + performSelector)
通过调用sleep(1)阻塞线程的方式来达到目的
import UIKit class GAPublishViewController: GABaseViewController { var jumpBut = UIButton(frame: CGRect(x: 15, y: 64, width: 80, height: 40)); var limitTime: Int = 5+1; override func viewDidLoad() { super.viewDidLoad() setupJumpButton(); startCountDown(); } func setupJumpButton() { view.addSubview(jumpBut); jumpBut.setTitle("跳过(5S)", for: .normal); jumpBut.setTitleColor(UIColor.red, for: .normal); jumpBut.addTarget(self, action: #selector(tapJumpAction(sender:)), for: .touchUpInside); } @objc func tapJumpAction(sender: Any) { let but = sender as! UIButton; let text = but.titleLabel?.text ?? ""; if (text == "跳过") { print("点击“跳过”"); } } // MARK: 定时方式一 func startCountDown() { performSelector(inBackground: #selector(countDownThread), with: nil) } @objc func countDownThread() { let timeCount = limitTime; for _ in 0..<timeCount { limitTime = limitTime - 1; self.performSelector(onMainThread: #selector(updateJumpBtn), with: self, waitUntilDone: true) sleep(1); } } @objc func updateJumpBtn() { if (limitTime <= 0) { jumpBut.setTitle("跳过", for: .normal); } else { jumpBut.setTitle("跳过" + "(\(limitTime)S)", for: .normal); } } }
计时方式二(sleep + GCD)
与上面的方式一类似
// MARK: 定时方式二 func startCountDown() { // 将任务添加到队列,以异步的方式执行 DispatchQueue.global().async { [weak self] in self?.countDownThread(); } } func countDownThread() { let timeCount = limitTime; for _ in 0..<timeCount { limitTime = limitTime - 1; // 主线程刷新UI DispatchQueue.main.async { [weak self] in self?.updateJumpBtn(); } sleep(1); } } func updateJumpBtn() { if (limitTime <= 0) { jumpBut.setTitle("跳过", for: .normal); } else { jumpBut.setTitle("跳过" + "(\(limitTime)S)", for: .normal); } }
计时方式三(Timer)
// MARK: 定时方式三 var limitTime: Int = 5; var timer: Timer?; func startCountDown() { // 初始化定时器 timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updateJumpBtn), userInfo: nil, repeats: true); /* // 避免timer在列表时,滑动时timer会暂停。 将timer放在另外一个线程中,然后开启这个线程的runloop。 DispatchQueue.global().async { [weak self] in self?.timer = Timer.scheduledTimer(timeInterval: 1.0, target: self as Any, selector: #selector(self?.countDownThread), userInfo: nil, repeats: true); RunLoop.current.run(); } */ } @objc func countDownThread() { // 主线程刷新UI DispatchQueue.main.async { [weak self] in self?.updateJumpBtn(); } } @objc func updateJumpBtn() { limitTime = limitTime - 1; if (limitTime <= 0) { jumpBut.setTitle("跳过", for: .normal); /* // 暂停定时器 timer?.fireDate = Date.distantFuture; // 继续定时 timer?.fireDate = NSDate.init() as Date; // 暂停定时器3秒 timer?.fireDate = Date.init(timeIntervalSinceNow: 3.0); */ // 停止定时器 timer?.invalidate(); } else { jumpBut.setTitle("跳过" + "(\(limitTime)S)", for: .normal); } }
计时方式四(GCD)
// MARK: 定时方式四 var limitTime: Int = 5+1; // 在global线程里创建一个时间源 let codeTimer = DispatchSource.makeTimerSource(queue: DispatchQueue.global()); func startCountDown() { // 设定这个时间源是每秒循环一次,立即开始 codeTimer.schedule(deadline: .now(), repeating: .seconds(1)); // 设定时间源的触发事件 codeTimer.setEventHandler(handler: { // 主线程刷新UI DispatchQueue.main.async { [weak self] in self?.updateJumpBtn(); } }) // 判断是否取消,如果已经取消了避免调用resume()方法导致的崩溃 if codeTimer.isCancelled { return; } // 启动时间源 codeTimer.resume(); } func updateJumpBtn() { limitTime = limitTime - 1; if (limitTime <= 0) { jumpBut.setTitle("跳过", for: .normal); // 暂停计时。暂停之后,再次开始计时(startCountDown())接着上次暂停进行计时 codeTimer.suspend(); // 取消计时。取消之后,再次开始计时(startCountDown())不会再计时 //codeTimer.cancel(); } else { jumpBut.setTitle("跳过" + "(\(limitTime)S)", for: .normal); } }
示意图
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
下一篇: Swift函数提前返回实例详解
相关文章
- 这篇文章主要为大家详细介绍了vue实现同时设置多个倒计时,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-05-20
- 这篇文章主要给大家介绍了关于swift中利用runtime交换方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。...2020-06-30
- 这篇文章主要介绍了基于JavaScript实现网页倒计时自动跳转代码 的相关资料,需要的朋友可以参考下...2015-12-29
- 有时候,我们需要一个显示文字,又想这些文字与边界之间有自定义的边距,所以下面这篇文章主要给大家介绍了关于Swift设置UILabel内边距的相关资料,需要的朋友可以参考下...2021-10-14
- 这篇文章主要为大家详细介绍了用javascript实现倒计时效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
- 倒计时一般是用来表示未来某一时刻距现在时刻还剩多少时间。倒计时在WEB上应用非常广泛,如考试系统倒计时,团购网站中的优惠活动倒计时等等。今天,我们来使用jQuery实现一个简单的倒计时功能。本文以团购网站的倒计时为...2015-10-21
- 在淘宝等购物网站,我们都会看到一个发送短信倒计时的按钮,究竟是如何实现的呢?下面小编通过本篇文章给大家分享一段代码关于js实现手机短信按钮倒计时,需要的朋友参考下...2016-01-02
- 这篇文章主要给大家介绍了关于swift中@UIApplicationMain的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。...2020-06-30
- 下面小编就为大家带来一篇单击按钮发送验证码,出现倒计时的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 代码...2017-07-06
- 这篇文章主要为大家详细介绍了Swift实现多个TableView侧滑与切换效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-30
- 这篇文章主要介绍了JS实现倒计时,精确到天数、时、分、秒,还为大家分享了parseInt() 函数的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-11-22
- 这篇文章主要介绍了jquery实现倒计时效果,根据设计一个游戏引出的倒计时功能,需要的朋友可以参考下...2015-12-16
- 这篇文章主要为大家详细介绍了uni-app使用countdown插件实现倒计时,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-11-02
- 这篇文章主要为大家详细介绍了JavaScript实现前端倒计时效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
- 这篇文章主要介绍了C#基于TimeSpan实现倒计时效果的方法,比较实用的功能,需要的朋友可以参考下...2020-06-25
- 给大家详细讲解了IOS开发中swift语言xcworkspace多项目管理的方法和介绍,一起参考一下。...2020-06-30
Swift 中如何使用 Option Pattern 改善可选项的 API 设计
这篇文章主要介绍了Swift 中如何使用 Option Pattern 改善可选项的 API 设计,帮助大家更好的进行ios开发,感兴趣的朋友可以了解下...2020-10-23- 这篇文章主要介绍了如何使用Swift来实现一个命令行工具,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-30
- 这篇文章主要给大家介绍了关于Swift中命名空间的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-30
浅析Swift中struct与class的区别(汇编角度底层分析)
这篇文章主要介绍了Swift中struct与class的区别 ,本文从汇编角度分析struct与class的区别,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-30