使用NSTimer仅以秒为单位倒计时(从00:20到0)

时间:2015-06-04 19:54:53

标签: ios swift countdown

我需要从20秒到0的标签倒计时并重新开始。这是我第一次在Swift中做项目,我正在尝试使用NSTimer.scheduledTimerWithTimeInterval。这个倒计时应该循环运行一段时间。

我很难实现开始重新开始方法(循环)。我基本上没有找到一种方法来启动20秒的时钟,当它结束时,再次启动它。

我很欣赏如何做到这一点 瓦格纳

 @IBAction func startWorkout(sender: AnyObject) {

    timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("countDownTime"), userInfo: nil, repeats: true)
    startTime = NSDate.timeIntervalSinceReferenceDate()

}

func countDownTime() {

    var currentTime = NSDate.timeIntervalSinceReferenceDate()

    //Find the difference between current time and start time.
    var elapsedTime: NSTimeInterval = currentTime - startTime

    //calculate the seconds in elapsed time.
    let seconds = UInt8(elapsedTime)
    elapsedTime -= NSTimeInterval(seconds)

    //find out the fraction of milliseconds to be displayed.
    let fraction = UInt8(elapsedTime * 100)

    //add the leading zero for minutes, seconds and millseconds and store them as string constants
    let strSeconds = seconds > 9 ? String(seconds):"0" + String(seconds)
    let strFraction = fraction > 9 ? String(fraction):"0" + String(fraction)

    //concatenate minuets, seconds and milliseconds as assign it to the UILabel
    timeLabel.text = "\(strSeconds):\(strFraction)"
}

4 个答案:

答案 0 :(得分:1)

您应该从现在开始设置日期结束时间20秒,然后检查日期timeIntervalSinceNow。一旦timeInterval达到0,你再从现在开始设置20秒

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var strTimer: UILabel!

    var endTime = NSDate().dateByAddingTimeInterval(20)
    var timer = NSTimer()

    func updateTimer() {
        let remaining = endTime.timeIntervalSinceNow
        strTimer.text = remaining.time
        if remaining <= 0 {
            endTime = NSDate().dateByAddingTimeInterval(20)
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        strTimer.text =  "20:00"
        timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: "updateTimer", userInfo: nil, repeats: true)
        NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

extension NSTimeInterval {
    var time:String {
        return String(format:"%02d:%02d", Int((self) % 60 ),Int(self*100 % 100 )  )
    }
}

答案 1 :(得分:0)

在你的countdownTime()中,当你的经过时间达到20秒时,将你的startTime更改为当前时间

答案 2 :(得分:0)

首先,如果您只是简单地循环而不停止,您可以使用模块来获取秒数。那是seconds % 20只会从19.9跳到0.0。因此,如果你倒计时,你会计算seconds - seconds % 20当它达到零时会跳到20。一遍又一遍地。这是你之后的事吗?

对于前导零,您可以使用:String(format: "%02d:%02d", seconds, fraction)。请注意格式:此处秒和分数是整数。

但是如果您需要停止计时器,则必须跟踪先前计算的秒数并在每次启动时重置startTime。每次停止时,您都必须将当前秒数加到之前计算的秒数。我有意义吗?

答案 3 :(得分:0)

要最小化处理,您可以创建两个计时器。一个计时器持续20秒,另一个计时器用于更新UI的频率。很难看到每秒100帧。如果您每0.01检查一次,则代码不太准确。手册非常有用。 https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/当您不再使用计时器invalidate并设置为nil时。其他计时功能也存在。