見出し画像

SwiftUIで行こう!- タイマーを作ろ! - 2

機能を追加していきます。参考サイトです。

タイマーの心臓部、class TimerManager:ObservableObject{}を編集していきます。

Pickerで選んだ時間をsecondsLeftに代入して使えるようにすること、その選んだ時間をUserDefaultsで記憶する命令を書いていきます。

@Published var secondsLeft = UserDefaults.standard.integer(forKey: "timerLength")
func setTimeLength(minutes:Int){
       let defalts = UserDefaults.standard
       defalts.set(minutes,forKey: "timerLength")
       secondsLeft = minutes
   }

関数を作ります。

  func reset(){
       self.timermode = .initial
       self.secondsLeft = UserDefaults.standard.integer(forKey: "timerLength")
       timer.invalidate()
   }
   
   func pause(){
       self.timermode = .pause
       timer.invalidate()
   }

この関数を .onTapGestureに追加していきます。

 Image(systemName: timerManager.timermode == .running ? "pause.circle.fill" : "play.circle.fill")
              .resizable()
              .aspectRatio(contentMode: .fit)
              .frame(width: 180, height: 180)
              .foregroundColor(.red)
              .onTapGesture(perform: {
                 self.timerManager.timermode == .running ? self.timerManager.pause() : self.timerManager.start()
   })

もう一つ。

   if timerManager.timermode == .pause{
        Image(systemName: "gobackward")
              .aspectRatio(contentMode: .fit)
              .frame(width: 50, height: 50)
              .padding(.top,40)
              .onTapGesture(perform: {
                   self.timerManager.reset()
                })
    }

 ContentView: View {}を編集します。関数setTimeLengthで実際のPickerで選んだインデックスを元に配列から該当する数字を抜き出し、60を掛けています。

availableMinutes[self.selectPickerIndex]*60

そしてタイマーの残りの秒数となる変数secondsLeftに代入します。

.onTapGesture(perform: {
if self.timerManager.timermode == .initial{
self.timerManager.setTimeLength(minutes: self.availableMinutes[self.selectPickerIndex]*60)
}

self.timerManager.timermode == .running ? self.timerManager.pause() : self.timerManager.start()
})

分、秒の変換を行うためにTimerMode.swift、enum{}の下に追記します。秒数で受けたものを分に変更し、表示を"分:秒"の形に整形します。

func secondsToMinutesAndSeconds(seconds:Int) -> String{
   let minutes = "\((seconds % 3600) / 60)"
   let seconds = "\((seconds % 3600) % 60)"
   let minuteStamp = minutes.count > 1 ? minutes : "0" + minutes
   let secondStamp = seconds.count > 1 ? seconds : "0" + seconds
   
   return "\(minuteStamp) : \(secondStamp)"
}

ContentView()を編集します。表示部分Text()を変更します。

Text(secondsToMinutesAndSeconds(seconds: timerManager.secondsLeft))

これでPickerで選んだ数字が"分:秒"になります。

タイマーを動かす方法としてはImage()で指定している画像に .onTapGesture(perform: {}に

TimerManager()

で書いたコードstart()、reset()などをタップした時に実行させます。これでタイマーが動き表示部には時間がカウントダウンされます。

この記事が気に入ったらサポートをしてみませんか?