如何制作秒表计时器

问题描述 投票:0回答:1

由于某种原因,秒表看起来还不错,但是与实际交易相比,它进行得太快了。我不知道该怎么办。我应该更改timeInterval吗?我希望它显示毫秒,秒和分钟,但是我尝试做的一切只会使它变得更糟。。谢谢

import UIKit
class ViewController: UIViewController {

    // Outlets
    @IBOutlet weak var minutes: UILabel!
    @IBOutlet weak var seconds: UILabel!
    @IBOutlet weak var milliSecondsLabel: UILabel!

    @IBOutlet weak var resetButton: UIButton!
    @IBOutlet weak var startButton: UIButton!
    @IBOutlet weak var pauseButton: UIButton!

    // Variables
    var timer = Timer()
    var time: Int = 0
    var running: Bool = false

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        roundButtons()

    }

    @IBAction func resetTimer(_ sender: Any) {
        timer.invalidate()
        time = 0
        updateUI()
        running = false
    }

    @IBAction func startTimer(_ sender: Any) {
        if running {
            return
        } else {
            timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(timerDidEnd), userInfo: nil, repeats: true)
            running = true
        }

    }

    @IBAction func pauseTimer(_ sender: Any) {
        timer.invalidate()
        running = false
    }


    func roundButtons() {
        resetButton.layer.cornerRadius = resetButton.frame.height / 2
        startButton.layer.cornerRadius = startButton.frame.height / 2
        pauseButton.layer.cornerRadius = pauseButton.frame.height / 2
    }

    @objc func timerDidEnd() {
        time += 1
        updateUI()
    }

    func updateUI() {

        var min: Int
        var sec: Int
        var mil: Int

        min = time / (60*60)
        sec = (time/60)%60
        mil = time & 60

        minutes.text = String(min)
        seconds.text = String(sec)
        milliSecondsLabel.text = String(mil)
    }
}
ios swift timer swift5
1个回答
0
投票

我建议两件事:

  1. 不要试图计算自己过去的时间。跟踪开始时间和计算的经过时间。您可以使用Date方法timeIntervalSince,或者因为不能保证返回单调递增的值,所以可以使用timeIntervalSince,如下所示。

  2. 而不是使用具有每秒100次更新的计时器,而应使用CACurrentMediaTime,该时间最适合设备屏幕刷新率。

例如:

CACurrentMediaTime

完全不相关,但是任何取决于视图大小(例如,圆角倒圆)的内容实际上都属于CADisplayLink,而不是CADisplayLink

© www.soinside.com 2019 - 2024. All rights reserved.