由于某种原因,秒表看起来还不错,但是与实际交易相比,它进行得太快了。我不知道该怎么办。我应该更改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)
}
}
我建议两件事:
不要试图计算自己过去的时间。跟踪开始时间和计算的经过时间。您可以使用Date
方法timeIntervalSince
,或者因为不能保证返回单调递增的值,所以可以使用timeIntervalSince
,如下所示。
而不是使用具有每秒100次更新的计时器,而应使用CACurrentMediaTime
,该时间最适合设备屏幕刷新率。
例如:
CACurrentMediaTime
完全不相关,但是任何取决于视图大小(例如,圆角倒圆)的内容实际上都属于CADisplayLink
,而不是CADisplayLink
。