【问题标题】:Countdown in seconds only (form 00:20 to 0) using NSTimer使用 NSTimer 仅以秒为单位倒计时(从 00:20 到 0)
【发布时间】:2015-06-04 19:54:53
【问题描述】:

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

我很难实现 StartStart again 方法(循环)。我基本上没有找到一种方法来启动 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)"
}

【问题讨论】:

    标签: ios swift countdown


    【解决方案1】:

    您应该从现在开始将日期 endTime 设置为 20 秒,然后只需检查日期 timeIntervalSinceNow。一旦 timeInterval 达到 0,您将在 20 秒后再次设置它

    import UIKit
    
    class ViewController: UIViewController {
    
        @IBOutlet weak var strTimer: UILabel!
    
        var endTime = Date(timeIntervalSinceNow: 20)
        var timer = Timer()
    
        @objc func updateTimer(_ timer: Timer) {
            let remaining = endTime.timeIntervalSinceNow
            strTimer.text = remaining.time
            if remaining <= 0 {
                endTime += 20
            }
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
            strTimer.font = .monospacedSystemFont(ofSize: 20, weight: .semibold)
            strTimer.text =  "20:00"
            timer = .scheduledTimer(timeInterval: 1/30, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
        }
    
    }
    

    extension TimeInterval {
        var time: String {
            String(format: "%02d:%02d", Int(truncatingRemainder(dividingBy: 60)), Int((self * 100).truncatingRemainder(dividingBy: 100)))
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

          为了尽量减少处理,您可以创建两个计时器。一个计时器为 20 秒,另一个计时器为您想要更新 UI 的频率。很难看到每秒 100 帧。如果您每 0.01 次检查一次,则您的代码不太准确。手册真的很有帮助。 https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/ 当您不再使用计时器时,无效并设置为零。还存在其他计时功能。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-03-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多