使用 .timeIntervalSince() 在 Swift 中创建秒表
Create a stopwatch in Swift using .timeIntervalSince()
我需要使用方法 timeIntervalSince() 在 Swift 中创建一个简单的秒表。
我真的不明白如何使用 timeIntervalSince(我需要什么以及如何实现它)以及如何将它转换成一个 String 来显示经过的时间,如“00:00:00”。
我知道我需要使用计时器来更新标签并在单击“停止”时使其无效。
我非常感谢对此的任何帮助。如果您需要更多信息,请告诉我。
方法timeIntervalSince(_:)
是Date
的方法。它为您提供自其他日期和您询问的日期以来经过的秒数。
所以,
创建 StopwatchVC。
给 StopwatchVC 一个 startTime
日期类型的变量。
还给它一个 Timer
变量。让我们称之为 updateTimer
.
当用户点击开始按钮时,将 Date()
(现在的时间)保存到 startTime。同时启动一个重复计时器,updateTimer
每 1/10 秒触发一次。 (或者无论你经常想更新你的秒表,但请注意,快于 1/60 是没有意义的,因为屏幕不能更新得比这快,而且计时器无论如何只能精确到大约 1/50 秒。)
每次 updateTimer
触发,计算自开始时间以来经过的秒数并将其显示到屏幕上:
let seconds = Date().timeIntervalSince(startTime)
Date()
是当前日期和时间,精度为 sub-millisecond。
Date().timeIntervalSince(startTime)
将为您提供自 startTime
以来的秒数,同样具有 sub-millisecond 的准确性。
格式化并在屏幕上显示经过的时间。您可以使用 DateComponentsFormatter
或使用 NumberFormatter 自己构建时间字符串,甚至 String(format:)
//
// StopWatchVC.swift
// Gem
//
// Created by Macbook 5 on 4/18/22.
//
import UIKit
class StopWatchVC:UIViewController {
var timer:Timer?
var startTime = Date()
let titleLabel = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(titleLabel)
titleLabel.frame = CGRect(x: 0, y: 0, width: 200, height: 60)
titleLabel.center = view.center
titleLabel.textColor = .red
view.backgroundColor = .white
timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: (#selector(updateTimer)), userInfo: nil, repeats: true)
}
@objc func updateTimer() {
let timeInterval = Date().timeIntervalSince(startTime)
titleLabel.text = timeInterval.stringFromTimeInterval()
}
}
extension TimeInterval{
func stringFromTimeInterval() -> String {
let time = NSInteger(self)
let ms = Int((self.truncatingRemainder(dividingBy: 1)) * 1000)
let seconds = time % 60
let minutes = (time / 60) % 60
let hours = (time / 3600)
return String(format: "%0.2d:%0.2d:%0.2d.%0.3d",hours,minutes,seconds,ms)
}
}
我需要使用方法 timeIntervalSince() 在 Swift 中创建一个简单的秒表。 我真的不明白如何使用 timeIntervalSince(我需要什么以及如何实现它)以及如何将它转换成一个 String 来显示经过的时间,如“00:00:00”。
我知道我需要使用计时器来更新标签并在单击“停止”时使其无效。
我非常感谢对此的任何帮助。如果您需要更多信息,请告诉我。
方法timeIntervalSince(_:)
是Date
的方法。它为您提供自其他日期和您询问的日期以来经过的秒数。
所以,
创建 StopwatchVC。
给 StopwatchVC 一个 startTime
日期类型的变量。
还给它一个 Timer
变量。让我们称之为 updateTimer
.
当用户点击开始按钮时,将 Date()
(现在的时间)保存到 startTime。同时启动一个重复计时器,updateTimer
每 1/10 秒触发一次。 (或者无论你经常想更新你的秒表,但请注意,快于 1/60 是没有意义的,因为屏幕不能更新得比这快,而且计时器无论如何只能精确到大约 1/50 秒。)
每次 updateTimer
触发,计算自开始时间以来经过的秒数并将其显示到屏幕上:
let seconds = Date().timeIntervalSince(startTime)
Date()
是当前日期和时间,精度为 sub-millisecond。
Date().timeIntervalSince(startTime)
将为您提供自 startTime
以来的秒数,同样具有 sub-millisecond 的准确性。
格式化并在屏幕上显示经过的时间。您可以使用 DateComponentsFormatter
或使用 NumberFormatter 自己构建时间字符串,甚至 String(format:)
//
// StopWatchVC.swift
// Gem
//
// Created by Macbook 5 on 4/18/22.
//
import UIKit
class StopWatchVC:UIViewController {
var timer:Timer?
var startTime = Date()
let titleLabel = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(titleLabel)
titleLabel.frame = CGRect(x: 0, y: 0, width: 200, height: 60)
titleLabel.center = view.center
titleLabel.textColor = .red
view.backgroundColor = .white
timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: (#selector(updateTimer)), userInfo: nil, repeats: true)
}
@objc func updateTimer() {
let timeInterval = Date().timeIntervalSince(startTime)
titleLabel.text = timeInterval.stringFromTimeInterval()
}
}
extension TimeInterval{
func stringFromTimeInterval() -> String {
let time = NSInteger(self)
let ms = Int((self.truncatingRemainder(dividingBy: 1)) * 1000)
let seconds = time % 60
let minutes = (time / 60) % 60
let hours = (time / 3600)
return String(format: "%0.2d:%0.2d:%0.2d.%0.3d",hours,minutes,seconds,ms)
}
}