Ios 如何为倒计时计时器实现单独的分钟和秒标签
好的,我正在开发一个倒计时功能,作为我正在开发的应用程序的一部分。我在如何实现计时器以及计时器在屏幕上的显示方面遇到了一些问题。我的两个问题是,Ios 如何为倒计时计时器实现单独的分钟和秒标签,ios,swift,xcode,timer,nstimer,Ios,Swift,Xcode,Timer,Nstimer,好的,我正在开发一个倒计时功能,作为我正在开发的应用程序的一部分。我在如何实现计时器以及计时器在屏幕上的显示方面遇到了一些问题。我的两个问题是, 现在我只有计时器可以倒数秒。计时器将自动启动 始终有10分钟的固定倒计时时间 我有两个单独的计时器标签,因为我希望它们以不同的方式显示 在屏幕上。是否可以将分钟和秒变量推送到显示屏上的单独标签上 如果有什么我没说清楚的,就问吧 如果您想通过seconds变量的递减值手动计算秒数,这是个坏主意。因为定时器不能保证它会在1秒间隔后准确触发。 在我看来,如
如果您想通过
seconds
变量的递减值手动计算秒数,这是个坏主意。因为定时器
不能保证它会在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)
}
}
类ViewController:UIViewController{
@ibvar minuteLabel:UILabel!
@IBVAR第二标签:UILabel!
变量计时器:计时器?
让我们倒计时间隔:时间间隔=10*60//分*秒
var finishTime:日期!
var pauseStartTime:日期?
@iAction func startTimer(\发送方:UIButton){
如果让暂停=暂停开始时间{
让pauseInterval=Date().timeIntervalSince(暂停)
finishTime.addTimeInterval(pauseInterval)
}否则{
finishTime=Date()。添加时间间隔(倒计时间隔)
}
pauseStartTime=nil
timer=timer.scheduledTimer(withTimeInterval:1,repeats:true,block:{[weak self]\uuuin self?.changeLabels()})
}
@iAction func pauseTimer(uSender:ui按钮){
pauseStartTime=日期()
计时器?.invalidate()
}
func changeLabels(){
让currentTime=Date()
保护currentTime
没有单独的分钟和秒变量;使用单个“秒”变量。我还建议您使用日期
设置从现在开始10分钟
而不是减少秒数,因为计时器
有抖动谢谢…这有助于倒计时计时器的分钟和秒数出现在两个不同的标签中。
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)
}
}