みやこです。
swiftでタイマーを利用したかったが、便利そうなライブラリが見つけられなかったので、
標準のTimerクラスを利用して実装してみました。
アプリの実際の様子 → https://youtu.be/4K0OmSMkfDU
主に次のn個のメソッドで作られています。
- startTimer・・・タイマーをスタートさせる
- updateTimer・・・タイマーが回っている途中、変数の内容を更新させたり、ラベルに反映させたりする。
- setUpTimer・・・タイマーの最初の設定を行う。変数の初期化とラベルへの反映
- resetTimer・・・タイマーをリセットするメソッド。
ソースコード
変数の定義
//Timerクラスを利用する
var timer = Timer()
//秒と分の変数を用意
var seconds:Int = 0
var minutes:Int = 0
var limit = 25 //これは制限時間です。
//分のタイマーラベル。
@IBOutlet weak var minuteLabel: UILabel!
//秒のタイマーラベル。
@IBOutlet weak var secondLabel: UILabel!
1.startTimer()
//タイマーをスタートさせるメソッド
@IBAction func startTimer(_ sender: Any) {
setUpTimer()
timer.invalidate() //timer = nilのイメージ。
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.updateTimer), userInfo: nil, repeats: true)
//↑1秒毎に自分のupdateTimerメソッドを繰り返し呼び出す。
}
2.updateTimer()
//startTimerメソッドで、繰り返し呼ばれるメソッド
@objc func updateTimer() {
seconds -= 1
if seconds <= -1{
minutes -= 1
seconds = 59
}
if minutes == 0 && seconds == 0{ //タイマーが終わったら・・
resetTimer((Any).self)
}
if seconds < 10 { //10秒未満だったら、09, 08という風に表示する。
secondLabel.text = String("0\(seconds)")
} else {
secondLabel.text = String(seconds)
}
minuteLabel.text = String(minutes)
}
3.setUpTimer()
func setUpTimer() {
seconds = 0
minutes = limit
if seconds < 10 {
secondLabel.text = String("0\(seconds)")
} else {
secondLabel.text = String(seconds)
}
minuteLabel.text = String(minutes)
}
4.resetTimer()
//リセットボタン
@IBAction func resetTimer(_ sender: Any) {
timer.invalidate()
setUpTimer()
}
さいごに
limitの値ををユーザーが指定できるようにすれば、自由に時間を計ることが可能ですし、 タイマーが終わった時になんらかの処理を書けば、通知を入れることも可能なので、 いろいろ応用ができると思います。ひよっこのコードですが、参考にしてみてください!!!みれくれてありがとうございました。