LoginSignup
4
7

More than 3 years have passed since last update.

【swift】 時計アプリをつくってみた。(自分専用アプリ開発その1)

Last updated at Posted at 2019-06-16

appstoreにいろんなアプリがいろんな仕様で出てますが、
最終的に自分の一番かゆいところに手を届かせようと思うと、
自分で作るしかないかな〜、というコトで、
休日使っていろいろアプリ組んでみることにしました。

で、いきなり難しいコトはできないので、
まずは時計アプリをば。

調べてマネしてみようと思ったら、
記事が古くてswiftの書き方が変わってたりでいろいろハマりましたが、
とりあえず以下の書き方で動くモノは完成。

画面イメージ

仕事中、ワイヤレス充電器に立てかけて
置き時計代わりに使いたいので、時分秒を大きく表示するデザインにしました。
(デザイン的にはまだ仮ですけど。)

スクリーンショット 2019-06-16 15.24.07.png

ソース

※項目の配置だけstoryboardでやってますが、そこは割愛します。

UIViewController.swift
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var txtYear: UITextField!
    @IBOutlet weak var txtMonth: UITextField!
    @IBOutlet weak var txtDay: UITextField!
    @IBOutlet weak var txtHour: UITextField!
    @IBOutlet weak var txtMinute: UITextField!
    @IBOutlet weak var txtSecond: UITextField!
    @IBOutlet weak var txtWeekday: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        viewInit()
        timerFiring()
    }

    func timerFiring() {
        let timer = Timer(timeInterval: 1,
                          target: self,
                          selector: #selector(timeCheck),
                          userInfo: nil,
                          repeats: true)
        RunLoop.main.add(timer, forMode: .default)
    }

    @objc func timeCheck() {
        let date = NSDate()
        let calendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)

        let arrWeekday: Array = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]

        let year = calendar?.component(.year, from: date as Date)
        let month = calendar?.component(.month, from: date as Date)
        let day = calendar?.component(.day, from: date as Date)
        let hour = calendar?.component(.hour, from: date as Date)
        let minute = calendar?.component(.minute, from: date as Date)
        let second = calendar?.component(.second, from: date as Date)
        let weekday = calendar?.component(.weekday, from: date as Date)
        let dayOfTheWeek = arrWeekday[weekday! - 1]

        txtYear.text = String(year!)
        editTextField(textField: txtYear, size: 50.0, color: .white)
        txtMonth.text = String(format: "%02d", month!)
        editTextField(textField: txtMonth, size: 50.0, color: .white)
        txtDay.text = String(format: "%02d", day!)
        editTextField(textField: txtDay, size: 50.0, color: .white)
        txtHour.text = String(format: "%02d", hour!)
        editTextField(textField: txtHour, size: 180.0, color: .white)
        txtMinute.text = String(format: "%02d", minute!)
        editTextField(textField: txtMinute, size: 180.0, color: .white)
        txtSecond.text = String(format: "%02d", second!)
        editTextField(textField: txtSecond, size: 180.0, color: .white)
        txtWeekday.text = String(dayOfTheWeek)
        editTextField(textField: txtWeekday, size: 50.0, color: .white)
    }

    func editTextField(textField:UITextField, size:CGFloat, color:UIColor) {
        textField.font = UIFont.boldSystemFont(ofSize: size)
        textField.textColor = color
        textField.isEnabled = false
    }

    func viewInit() {
        view.backgroundColor = UIColor.black
    }
}

ハマりポイントなど

自分の理解が足りなくて書き方が悪いのか、
NSCalendar.componentから、年月日時分秒曜日を一括で取得した変数を作って、
あとはそこから一つずつ欲しい要素を画面にセットするだけ、
という感じのサンプルがあったんですが、
その書き方だとどうしてもエラーが抜けられなかったので、
NSCalender.componentから各項目一つずつを取得する書き方にしました。

あとは、Timerを定義して.fire()で着火してあげれば
1秒ごとに時刻取得して画面表示も更新されると思っていましたが、
どうも起動時に1回動いたきり、止まってしまっていたようなので、
Runloopで繰り返し処理に乗せています。

ごく簡単な機能のハズが、いざ書いてみるとこれだけで3、4時間かかってました。。
swift開発も生産性上げていきたい。

ここからのアップデート

これをベースに、設定画面で配色・フォント等のデザイン変えたり、
アラーム(タイマー)機能やら、別画面でタスクリスト機能やら、
プッシュ通知なんかも実装していきたいなぁ、と思ってます。

4
7
1

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
7