1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

クリスマス終了までをカウントダウンしたい

この記事は クソアプリ2 Advent Calendar 2020 の25日目の投稿です。
昨日は@inabajunmrさんの「ここにタイトルを入れます」でした。

はじめに

今回初めてQiita アドベントカレンダーに参加しました。
去年や一昨年のアドベントカレンダーの「クソアプリ」の参加者の方の記事を読みましたが、とても楽しそうでした。
僕も今回楽しみたいと思います。

今回作ったもの

クリスマス終了までをカウントダウンするアプリです。(スクリーンショットの画像はイメージがしやすいように別の日付を設定しています)
スクリーンショット 2020-12-06 11.22.02.png

作ろうと思った経緯

このアプリを作ろうと思った経緯は、私が初心者なので勉強した事で「クソアプリ」を作ろうと思いました。
今回ちょうど、タイマーについて学んでいました。
そこで「タイマー機能」と「プログレスバー」を使ったアプリを作ろうと思いました。

story boardにLabelなどを配置

スクリーンショット 2020-12-06 14.16.02.png

タイマーの設定とLabelに時間を表示

let futureDate: Date = {
        var future = DateComponents(
            year: 2020,
            month: 12,
            day: 25, 
            hour: 0,
            minute: 0,
            second: 0
        )
        return Calendar.current.date(from: future)!
    }()

    var countdown: DateComponents {
        //2つの指定された日付けの差を返す
        return Calendar.current.dateComponents([.day, .hour, .minute, .second], from: Date(), to: futureDate)
    }

    //カウントダウンされている「時間」「分」「秒」が表示される
    @objc func updateTime() {
        let countdown = self.countdown
        let hours = countdown.hour!
        let minutes = countdown.minute!
        let seconds = countdown.second!

        timeLabel.text = String(hours)
        minutesLabel.text = String(minutes)
        secondsLabel.text = String(seconds)
    }

    func runCountdown() {
        Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
    }

progressBarに値を入れ、バーと%を表示する

runCountdown()

        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        let startDate = formatter.date(from: "2020-12-24 00:00:00")!

        //現時刻と2020年12月25日との時間の差
        let duration = formatter.date(from: "2020-12-25 00:00:00")?.timeIntervalSinceNow
        //絶対値に変換
        let durationFabs = fabs(duration!)
        //少数点以下四捨五入
        let durationRound = round(durationFabs)

        //2020年12月24日から2020年12月25日までのトータル時間
        let elapsed = formatter.date(from: "2020-12-25 00:00:00")?.timeIntervalSince(startDate)

        //パーセンテージを出す
        let percentage = (durationRound / elapsed!) * 100
        let percentageBarProgress = 1 - (durationRound / elapsed!)


        let percentageInteger = (round(100 * 10) / 10) - (round(percentage * 10) / 10)

        progressBar.progress = Float(percentageBarProgress)

        percentLabel.text = String("\(round(percentageInteger * 100) / 100) %")

        print(durationRound)//今現在と指定した時間との差の秒が表示される
        print(elapsed!)
        print(percentageInteger)
        print(percentageBarProgress)

難しかった点

難しかった点は2つありました。
①12月25日(現時点での時間)から12月26日までの差分をどのように出せば良いかわからなかった点。

1日のトータル時間を出しました。

 let elapsed = formatter.date(from: "2020-12-25 00:00:00")?.timeIntervalSince(startDate)

25日0時00分からどれくらい時間が経過したかの値を取得しました。

 //現時刻と2020年12月26日との時間の差
        let duration = formatter.date(from: "2020-12-26 00:00:00")?.timeIntervalSinceNow
        //絶対値に変換
        let durationFabs = fabs(duration!)
        //少数点以下四捨五入
        let durationRound = round(durationFabs)

現在まで経過した時間 / 1日のトータル時間 * 100 でパーセントを出しました。

//パーセンテージを出す
        let percentage = (durationRound / elapsed!) * 100

今日の残りの時間を出す為に1から引きます(パーセントにしていない100をかけていない値を使います)

let percentageBarProgress = 1 - (durationRound / elapsed!)

②Labelに残りの%表示で小数点1まで表示する方法がわからなかった点。
小数点以下の表示をする時は、小数点第2位四捨五入は下記のようにする。

 let percentageInteger = (round(100 * 10) / 10) - (round(percentage * 10) / 10)

Labelに小数点第1位まで表示する場合は、10 / 10  ではなく 100 / 100 を使用します。

 percentLabel.text = String("\(round(percentageInteger * 100) / 100) %")

小数点表示に関しては、手を動かしていたら出来た感じなので、もう少し理解を深めないといけないと感じています。

終わりに

今回初めてアドベントカレンダーに参加をしました。
なかなか、このような機会がないと学びをアウトプットする機会はありません。
このような素敵な発表の場を作っていただき、ありがとうございました。

みなさんのような、素敵なクソアプリは作れませんでしたが、とても楽しかったです。

これからもSwiftの勉強に励みたいと思います。

twitter

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
1
Help us understand the problem. What are the problem?