当前位置 : 主页 > 手机开发 > ios >

ios – 使用Swift中的NSTimer在几个十进制插槽中倒计时

来源:互联网 收集:自由互联 发布时间:2021-06-11
我想制作一个以10.0000000开始计时器的应用程序,我希望它完美倒计时 到目前为止,这是我的代码: import UIKitclass ViewController: UIViewController { @IBOutlet weak var labelTime: UILabel! var counter = 10.000
我想制作一个以10.0000000开始计时器的应用程序,我希望它完美倒计时
到目前为止,这是我的代码:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var labelTime: UILabel!

    var counter = 10.0000000

    var labelValue: Double {
        get {
            return NSNumberFormatter().numberFromString(labelTime.text!)!.doubleValue
        }
        set {
            labelTime.text = "\(newValue)"
        }
    }


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        labelValue = counter
        var timer = NSTimer.scheduledTimerWithTimeInterval(0.0000001, target: self, selector: ("update"), userInfo: nil, repeats: true)
    }

    func update(){
        labelValue -= 0.0000001
    }


}

会发生什么事情,我的倒计时非常慢,它只是不起作用,需要1小时才能达到0秒,而不是仅仅10秒.有任何想法吗?我应该对代码做出哪些更改?
谢谢

定时器不是超精确的,NSTimer的分辨率大约是1/50秒.

此外,iPhone屏幕的刷新率为60帧/秒,因此以更快的速度运行计时器完全没有意义.

而不是每次触发时都尝试使用计时器递减某些内容,而是创建一个每秒触发50次的计时器,并让它使用时钟数学来根据剩余时间更新显示:

var futureTime: NSTimeInterval 

override func viewDidLoad() {
    super.viewDidLoad()
    labelValue = counter

    //FutureTime is a value 10 seconds in the future.
    futureTime = NSDate.timeIntervalSinceReferenceDate() + 10.0 

    var timer = NSTimer.scheduledTimerWithTimeInterval(
      0.02, 
      target: self, 
      selector: ("update:"), 
      userInfo: nil, 
      repeats: true)
}

func update(timer: NSTimer)
{
  let timeRemaining = futureTime - NSDate.timeIntervalSinceReferenceDate()
  if timeRemaining > 0.0
  {
    label.text = String(format: "%.07f", timeRemaining)
  }
  else
  {
    timer.invalidate()
    //Force the label to 0.0000000 at the end
    label.text = String(format: "%.07f", 0.0)
  }
}
网友评论