iOS 如何创建倒计时时间 [小时、分钟、秒] Swift 4 [英] iOS How to create countdown time [hours,minutes,seccond] Swift 4

查看:52
本文介绍了iOS 如何创建倒计时时间 [小时、分钟、秒] Swift 4的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建倒计时时间,但我找不到这样的信息我该怎么做.

I want create countdown time, but i can not find such information how i can do this.

例如,我有 200 分钟,3.3 小时.

For example i have 200 minutes it's 3,3 hours.

对于这个 3,3 小时,我想要倒计时,我可以在标签上看到这些信息吗?

For this 3,3 hours i want make count down timer, and this information can i see at the label?

我该怎么做?

我在论坛上找到了这样的代码:

I found such code at the forum:

func startTimer() {

    let releaseDateString = "03:33:00"
    let releaseDateFormatter = DateFormatter()
    releaseDateFormatter.dateFormat = "HH:mm:ss"
    releaseDate = releaseDateFormatter.date(from: releaseDateString)! as NSDate

    countdownTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
}

@objc func updateTime() {

    let currentDate = Date()
    let calendar = Calendar.current

    let diffDateComponents = calendar.dateComponents([.hour, .minute, .second], from: currentDate, to: releaseDate! as Date)

    let countdown = "Hours \(diffDateComponents.hour ?? 0), Minutes \(diffDateComponents.minute ?? 0), Seconds \(diffDateComponents.second ?? 0)"
    label.text = "\(countdown)"

    print(countdown)
}

但我得到了这样的结果:

But i got such result:

小时 -163779,分钟 -48,秒 -34

Hours -163779, Minutes -48, Seconds -34

推荐答案

退一步思考问题.定期更新 UI 实际上非常简单,但它也不可靠(它只保证至少"精度),因此您不能依靠它来准确更新计数器或基于时间的值(即,您不应该使用它在每个刻度上增加一个秒"值).

Step back for a moment and think about the problem. Updating the UI on a regular bases is actually pretty simply, but it's also unreliable (it only guarantees "at least" precision), so you can't rely on it to accurately update counters or time based values (ie, you shouldn't use it to increment a "second" value on each tick).

您想要的是一个锚定"时间,您可以从中计算出运行时间总量,然后计算剩余时间.

What you want is an "anchor" time from which you can calculate the total amount of running time and then calculate the remaining time.

Swift/Apple 提供了许多简洁的 API,您可以使用它们来完成所有这些事情.

Swift/Apple provides a number of neat APIs which you can use to accomplish all these things.

这只是我在操场上拼凑起来的东西...

This is just something I threw together in a Playground...

import UIKit

// Anchor time
let startTime: Date = Date()
// The total amount of time to wait
let duration: TimeInterval = 200 * 60 // 200 minutes

let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.hour, .minute, .second]
formatter.zeroFormattingBehavior = .dropLeading
formatter.unitsStyle = .short
// The amount of time which has past since we started
var runningTime: TimeInterval = 0

// This is just so I can atrificially update the time
var time: Date = Date()
let cal: Calendar = Calendar.current
repeat {
    // Simulate the passing of time, by the minute
    // If this was been called from a timer, then you'd
    // simply use the current time
    time = cal.date(byAdding: .minute, value: 1, to: time)!

    // How long have we been running for?
    runningTime = time.timeIntervalSince(startTime)
    // Have we run out of time?
    if runningTime < duration {
        // Print the amount of time remaining
        print(formatter.string(from: duration - runningTime)!)
    }
} while runningTime < duration

这将打印出来...

3 hr, 18 min, 59 sec
3 hr, 17 min, 59 sec
3 hr, 16 min, 59 sec
3 hr, 15 min, 59 sec
3 hr, 14 min, 59 sec
3 hr, 13 min, 59 sec
3 hr, 12 min, 59 sec
3 hr, 11 min, 59 sec
3 hr, 10 min, 59 sec
3 hr, 9 min, 59 sec
3 hr, 8 min, 59 sec
3 hr, 7 min, 59 sec
3 hr, 6 min, 59 sec
3 hr, 5 min, 59 sec
3 hr, 4 min, 59 sec
3 hr, 3 min, 59 sec
3 hr, 2 min, 59 sec
3 hr, 1 min, 59 sec
3 hr, 0 min, 59 sec
2 hr, 59 min, 59 sec
2 hr, 58 min, 59 sec
2 hr, 57 min, 59 sec
2 hr, 56 min, 59 sec
2 hr, 55 min, 59 sec
2 hr, 54 min, 59 sec
2 hr, 53 min, 59 sec
2 hr, 52 min, 59 sec
2 hr, 51 min, 59 sec
2 hr, 50 min, 59 sec
2 hr, 49 min, 59 sec
2 hr, 48 min, 59 sec
2 hr, 47 min, 59 sec
2 hr, 46 min, 59 sec
2 hr, 45 min, 59 sec
2 hr, 44 min, 59 sec
2 hr, 43 min, 59 sec
2 hr, 42 min, 59 sec
2 hr, 41 min, 59 sec
2 hr, 40 min, 59 sec
2 hr, 39 min, 59 sec
2 hr, 38 min, 59 sec
2 hr, 37 min, 59 sec
2 hr, 36 min, 59 sec
2 hr, 35 min, 59 sec
2 hr, 34 min, 59 sec
2 hr, 33 min, 59 sec
2 hr, 32 min, 59 sec
2 hr, 31 min, 59 sec
2 hr, 30 min, 59 sec
2 hr, 29 min, 59 sec
2 hr, 28 min, 59 sec
2 hr, 27 min, 59 sec
2 hr, 26 min, 59 sec
2 hr, 25 min, 59 sec
2 hr, 24 min, 59 sec
2 hr, 23 min, 59 sec
2 hr, 22 min, 59 sec
2 hr, 21 min, 59 sec
2 hr, 20 min, 59 sec
2 hr, 19 min, 59 sec
2 hr, 18 min, 59 sec
2 hr, 17 min, 59 sec
2 hr, 16 min, 59 sec
2 hr, 15 min, 59 sec
2 hr, 14 min, 59 sec
2 hr, 13 min, 59 sec
2 hr, 12 min, 59 sec
2 hr, 11 min, 59 sec
2 hr, 10 min, 59 sec
2 hr, 9 min, 59 sec
2 hr, 8 min, 59 sec
2 hr, 7 min, 59 sec
2 hr, 6 min, 59 sec
2 hr, 5 min, 59 sec
2 hr, 4 min, 59 sec
2 hr, 3 min, 59 sec
2 hr, 2 min, 59 sec
2 hr, 1 min, 59 sec
2 hr, 0 min, 59 sec
1 hr, 59 min, 59 sec
1 hr, 58 min, 59 sec
1 hr, 57 min, 59 sec
1 hr, 56 min, 59 sec
1 hr, 55 min, 59 sec
1 hr, 54 min, 59 sec
1 hr, 53 min, 59 sec
1 hr, 52 min, 59 sec
1 hr, 51 min, 59 sec
1 hr, 50 min, 59 sec
1 hr, 49 min, 59 sec
1 hr, 48 min, 59 sec
1 hr, 47 min, 59 sec
1 hr, 46 min, 59 sec
1 hr, 45 min, 59 sec
1 hr, 44 min, 59 sec
1 hr, 43 min, 59 sec
1 hr, 42 min, 59 sec
1 hr, 41 min, 59 sec
1 hr, 40 min, 59 sec
1 hr, 39 min, 59 sec
1 hr, 38 min, 59 sec
1 hr, 37 min, 59 sec
1 hr, 36 min, 59 sec
1 hr, 35 min, 59 sec
1 hr, 34 min, 59 sec
1 hr, 33 min, 59 sec
1 hr, 32 min, 59 sec
1 hr, 31 min, 59 sec
1 hr, 30 min, 59 sec
1 hr, 29 min, 59 sec
1 hr, 28 min, 59 sec
1 hr, 27 min, 59 sec
1 hr, 26 min, 59 sec
1 hr, 25 min, 59 sec
1 hr, 24 min, 59 sec
1 hr, 23 min, 59 sec
1 hr, 22 min, 59 sec
1 hr, 21 min, 59 sec
1 hr, 20 min, 59 sec
1 hr, 19 min, 59 sec
1 hr, 18 min, 59 sec
1 hr, 17 min, 59 sec
1 hr, 16 min, 59 sec
1 hr, 15 min, 59 sec
1 hr, 14 min, 59 sec
1 hr, 13 min, 59 sec
1 hr, 12 min, 59 sec
1 hr, 11 min, 59 sec
1 hr, 10 min, 59 sec
1 hr, 9 min, 59 sec
1 hr, 8 min, 59 sec
1 hr, 7 min, 59 sec
1 hr, 6 min, 59 sec
1 hr, 5 min, 59 sec
1 hr, 4 min, 59 sec
1 hr, 3 min, 59 sec
1 hr, 2 min, 59 sec
1 hr, 1 min, 59 sec
1 hr, 0 min, 59 sec
59 min, 59 sec
58 min, 59 sec
57 min, 59 sec
56 min, 59 sec
55 min, 59 sec
54 min, 59 sec
53 min, 59 sec
52 min, 59 sec
51 min, 59 sec
50 min, 59 sec
49 min, 59 sec
48 min, 59 sec
47 min, 59 sec
46 min, 59 sec
45 min, 59 sec
44 min, 59 sec
43 min, 59 sec
42 min, 59 sec
41 min, 59 sec
40 min, 59 sec
39 min, 59 sec
38 min, 59 sec
37 min, 59 sec
36 min, 59 sec
35 min, 59 sec
34 min, 59 sec
33 min, 59 sec
32 min, 59 sec
31 min, 59 sec
30 min, 59 sec
29 min, 59 sec
28 min, 59 sec
27 min, 59 sec
26 min, 59 sec
25 min, 59 sec
24 min, 59 sec
23 min, 59 sec
22 min, 59 sec
21 min, 59 sec
20 min, 59 sec
19 min, 59 sec
18 min, 59 sec
17 min, 59 sec
16 min, 59 sec
15 min, 59 sec
14 min, 59 sec
13 min, 59 sec
12 min, 59 sec
11 min, 59 sec
10 min, 59 sec
9 min, 59 sec
8 min, 59 sec
7 min, 59 sec
6 min, 59 sec
5 min, 59 sec
4 min, 59 sec
3 min, 59 sec
2 min, 59 sec
1 min, 59 sec
59 sec

DateComponentsFormatter 的好处在于它的合理配置和利用设备本地化设置生成其输出

The nice thing about DateComponentsFormatter is it's reasonably configurable and makes use of the devices localisation settings to generate its output

您还可以查看 停止计时器在 Swift 中定义的时间量,它提供了相同概念的可运行示例,但也支持暂停/恢复功能

You could also look at Stopping timer at defined amount of time in Swift which presents a runnable example of the same concept, but also supports pause/resume capabilities

这篇关于iOS 如何创建倒计时时间 [小时、分钟、秒] Swift 4的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆