ios - 如何为倒数计时器实现单独的分钟和秒标签
问题描述
好的,所以我正在开发倒数计时器功能,作为我正在开发的应用程序的一部分。我在如何实现计时器以及它在屏幕上的显示方式方面遇到了一些问题。我的两个问题是,
- 现在我只有能够倒数秒的计时器。计时器将始终具有 10 分钟的固定倒计时时间。
- 我有两个单独的计时器标签,因为我希望它们在屏幕上显示不同。是否可以将分钟和秒变量推送到显示器上的单独标签?
如果有什么我没有说清楚的就问。
import UIKit
class ViewController: UIViewController {
//MARK: - Countdown Timer Connections
@IBOutlet weak var minuteLabel: UILabel!
@IBOutlet weak var secondLabel: UILabel!
//MARK: - Seed Connections
@IBOutlet weak var seedSlot1: UIImageView!
@IBOutlet weak var seedSlot2: UIImageView!
@IBOutlet weak var seedSlot3: UIImageView!
@IBOutlet weak var seedSlot4: UIImageView!
//MARK: - Start/Pause Button Connection
@IBOutlet weak var startButton: UIButton!
@IBOutlet weak var stopButton: UIButton!
@IBOutlet weak var pauseButton: UIButton!
//MARK: - Variables
var timer = Timer()
var isTimerRunning : Bool = false
var resumeTapped: Bool = false
var minutes : Int = 24
var seconds: Int = 10
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
pauseButton.setImage(nil, for: .normal)
stopButton.setImage(nil, for: .normal)
}
//MARK: Timer Control Functions
//MARK: - Start Timer
@IBAction func startTimer(_ sender: UIButton) {
if isTimerRunning == false {
isTimerRunning = true
setButtons()
timer = Timer.scheduledTimer(
timeInterval: 1,
target: self,
selector: (#selector(ViewController.updateTimer)),
userInfo: nil,
repeats: true
)
print("The timer is currently running: \(isTimerRunning)")
} else {
isTimerRunning = false
setButtons()
print("The timer is currently running: \(isTimerRunning)")
}
print(secondLabel.text)
}
//MARK: - Stop Timer
@IBAction func stopTimer(_ sender: UIButton) {
timer.invalidate()
isTimerRunning = false
seconds = 60
minuteLabel.text = "\(minutes)"
secondLabel.text = "\(seconds)"
setButtons()
}
//MARK: - Pause Timer
@IBAction func pauseTimer(_ sender: UIButton) {
if resumeTapped == false {
timer.invalidate()
isTimerRunning = false
setButtons()
} else {
startTimer(startButton)
isTimerRunning = true
setButtons()
}
}
func timeString (time:TimeInterval) -> String {
let secondValue = Int(time) & 60
let minuteValue = Int(time) / 60 % 60
return String(format: "%02i", minuteValue, secondValue)
}
//MARK: - Update Timer
@objc func updateTimer() {
seconds -= 1 //This will decrement(count down)the seconds.
secondLabel.text = timeString(time: TimeInterval(seconds)) //This will update the seconds text label
}
解决方案
如果您想通过递减seconds
变量的值手动计算秒数,这是一个坏主意。因为Timer
不保证它会在 1 秒间隔后准确触发。在我看来,如果您要计算计时器启动时间和当前时间之间的时间间隔,这是首选方法。
class ViewController: UIViewController {
@IBOutlet weak var minuteLabel: UILabel!
@IBOutlet weak var secondLabel: UILabel!
var timer: Timer?
let countDownInterval: TimeInterval = 10*60 // minutes*seconds
var finishTime: Date!
var pauseStartTime: Date?
@IBAction func startTimer(_ sender: UIButton) {
if let pause = pauseStartTime {
let pauseInterval = Date().timeIntervalSince(pause)
finishTime.addTimeInterval(pauseInterval)
} else {
finishTime = Date().addingTimeInterval(countDownInterval)
}
pauseStartTime = nil
timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { [weak self] _ in self?.changeLabels() })
}
@IBAction func pauseTimer(_ sender: UIButton) {
pauseStartTime = Date()
timer?.invalidate()
}
func changeLabels() {
let currentTime = Date()
guard currentTime < finishTime else {
// Countdown finished
timer?.invalidate()
minuteLabel.text = String(format: "%02.f", 0)
secondLabel.text = String(format: "%02.f", 0)
return
}
let currentInterval = finishTime.timeIntervalSince(currentTime)
let minutes = (currentInterval / 60).rounded(.down)
let seconds = currentInterval.truncatingRemainder(dividingBy: 60).rounded()
minuteLabel.text = String(format: "%02.f", minutes)
secondLabel.text = String(format: "%02.f", seconds)
}
}
推荐阅读
- discord.js - 服务器加入日志显示“${guild.name}”而不是公会名称
- c# - 如何使用 Brep 对象的其中一个面与 XY、XZ 或 YZ 平面平行对齐?
- r - 在 R 中未正确读取小数
- arrays - 如何将这个 JS 对象数组转换为 Swift 元组数组?
- javascript - 用于验证用户名的正则表达式
- javascript - 我如何使用 Discord 机器人解除对人的禁令?
- pandas - 熊猫根据条件排名
- opencv - 安装后如何最小化opencv构建?
- prolog - HiLog 是否添加了 Prolog 中“调用”无法完成的任何操作?
- sql-server - TSQL:我有一个基本的查询问题 qr