Swift - 使用UIDatePicker实现倒计时功能
前端之家收集整理的这篇文章主要介绍了
Swift - 使用UIDatePicker实现倒计时功能,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果使用UIDatePicker时将模式设置为CountDownTimer,即可让该控件作为倒计时器来使用。效果图如下:
@H_
403_2@
// ViewController.swift
// CountDownTimerDemo
//
// Created by wsf on 16/1/26.
// Copyright © 2016年 wsf. All rights reserved.
//
import UIKit
class ViewController: UIViewController,UIAlertViewDelegate{
var datePickerView: UIDatePicker!;
var btnstart: UIButton!;
var leftTime: Int = 180;
var alertView: UIAlertView!;
var timer: NSTimer!;
override func viewDidLoad() {
super.viewDidLoad()
datePickerView = UIDatePicker(frame: CGRectMake(0.0,120.0,200.0,200.0));
self.datePickerView.datePickerMode = UIDatePickerMode.CountDownTimer;
datePickerView.locale = NSLocale(localeIdentifier: "zh_CN");
// 必须为60的整数倍,比如设置为100, 值
自动变为60
self.datePickerView.countDownDuration = NSTimeInterval(leftTime);
datePickerView.addTarget(self,action: "timeChanged",forControlEvents: UIControlEvents.ValueChanged);
self.view.addSubview(datePickerView)
btnstart = UIButton(type: .System);
btnstart.frame = CGRect(x: 100,y: 400,width: 100,height: 100);
btnstart.setTitleColor(UIColor.redColor(),forState: UIControlState.Normal);
btnstart.setTitleColor(UIColor.grayColor(),forState: UIControlState.Disabled);
btnstart.setTitle("开始",forState: UIControlState.Normal);
btnstart.setTitle("倒计时中",forState: UIControlState.Disabled);
btnstart.clipsToBounds = true;
btnstart.layer.cornerRadius = 5;
btnstart.addTarget(self,action: "startClicked:",forControlEvents: UIControlEvents.TouchUpInside);
self.view.addSubview(btnstart);
}
func timeChanged() {
print("您选择倒计时间为: \(self.datePickerView.countDownDuration)");
}
/** 开始倒计时按钮点击 */
func startClicked(sender: UIButton) {
self.btnstart.enabled = false;
//
获取该倒计时器的剩余时间
leftTime = Int(self.datePickerView.countDownDuration);
// 禁用UIDatePicker控件和按钮
self.datePickerView.enabled = false;
// 创建一个UIAlertView对象(警告框),并确认,倒计时开始
alertView = UIAlertView();
alertView.title = "倒计时开始";
alertView.message = "倒计时开始,还有\(leftTime)秒...";
alertView.addButtonWithTitle("确定");
alertView.delegate = self;
//
显示UIAlertView组件
alertView.show();
// 启动计时器,控制每秒执行一次tickDown
timer = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(1),target: self,selector: Selector("tickDown"),userInfo: nil,repeats: true);
}
func alertView(alertView: UIAlertView,clickedButtonAtIndex buttonIndex: Int) {
if buttonIndex == 0 {
endTimer();
}
}
/**
关闭定时器 */
func endTimer() {
// 取消定时器
timer.invalidate();
// 启用UIDatePicker控件和按钮
self.datePickerView.enabled = true;
self.btnstart.enabled = true;
alertView.message = "时间到!";
}
/** 计时器每秒触发事件 */
func tickDown() {
alertView.message = "倒计时开始,还有\(leftTime)秒...";
// 剩余时间减少1秒
leftTime-- ;
//
修改UIDatePicker的剩余时间
self.datePickerView.countDownDuration = NSTimeInterval(leftTime);
print(leftTime);
// 如果剩余时间小于等于0
if (leftTime <= 0) {
endTimer();
}
}
}
上面的代码其实还是有个小bug的。
(1)
问题描述:代码中给时间控件
添加了个
ValueChanged事件监听响应,目的是想每次选择的时间改变时都会触发打印出时间。但运行会发现,第一次拨动表盘不触发,后面再改变值才会触发。
(2)
解决办法:这个是iOS的bug,我们把设置初始时间
代码
1
2
|
self
.ctimer.countDownDuration =
NSTimeInterval
(leftTime);
|
修改成
2
3
dispatch_async(dispatch_get_main_queue(),{
(
.leftTime);
})
|
(如果我们不需要关心值改变事件的话,直接用原来的赋值方法即可。)