LoginSignup
4
8

More than 3 years have passed since last update.

[Swift]カウントダウンタイマー

Last updated at Posted at 2019-08-23

初心者の方必見!!!
Swift5にてカウントダウンタイマーを作成します。

スクリーンショット 2019-08-23 16.43.25.png
このようなカウントダウンタイマーです。
意外とネット上のコードは使えないものが多いので、重宝すると思います。

このアプリを実行するには2つのファイルに書き出します。
・DataManager.swift (ファイルの作成が必要)
・ViewController.swift(最初からあります)

DateManager.swift
import Foundation
import UIKit

class DateManager {

    private let formatter = DateFormatter()
    private let date = Date()
    private var dateStr: String?
    private let calendar = Calendar(identifier: .gregorian)

    init(){
        formatter.timeZone = TimeZone.ReferenceType.local
        formatter.dateFormat = "yyyy-MM-dd-HH-mm-ss"
        dateStr = ""
    }
    //現在時刻を返します"yyyy-MM-dd-HH-mm-ss"
    func getNowDate() -> String{
        dateStr = formatter.string(from: date)
        guard let now = dateStr else { return ""}
        return now
    }
    //設定したカウントダウンの秒数を返してくれます
    func getXmaxTimeInterval() -> Int {
        guard let xmas = calendar.date(from: DateComponents(year: 2019, month: 12, day: 25)) else { return 0}
        let spanFromWow = xmas.timeIntervalSinceNow
        return Int(floor(spanFromWow))
    }

}

ViewController.swift
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var snowView: UIView!
    @IBOutlet weak var countLabel: UILabel!

    let date = DateManager()
    var timer: Timer!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
        //カウントダウン
        timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.update), userInfo: nil, repeats: true)
        timer.fire()
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(true)
        timer.invalidate()
        timer = nil
    }

    @objc func update(tm: Timer) {

        let count: Int = date.getXmaxTimeInterval()
        let count2: TimeInterval = TimeInterval(count)
        let formatter = DateComponentsFormatter()

        // 表示フォーマットを変更..positionalや.fullで表示が変わります.
        formatter.unitsStyle = .brief
        // 使用する単位 .minuteのみにすると232,071minのように出力されます.
        formatter.allowedUnits = [.year, .month, .day, .hour, .minute, .second]
        // 作成したformatterでtimeintervalをstringに変換します.
        print(formatter.string(from: count2)!) // →5mths 10days 3hr 44min 28sec
        //時間をラベルに表示
        countLabel.text = formatter.string(from: count2)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

StoryBoardにてラベルと背景画像をOutlet接続したら完成します。

できたらコメントにグヘグヘ!お願いしますw
分からないことがありましたら、遠慮なくコメントくださいね。

4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8