見出し画像

SwiftUIでいこう! - Stopwatchを作る。

早速コードを書いていきます。

import SwiftUI
struct ContentView: View {
   var body: some View {
       VStack {
           Text("0.0")
               .font(.custom("Futura", size: 50))
               .padding(.top,200)
               .padding(.bottom,100)
               .padding(.trailing,100)
               .padding(.leading,100)
           
           Button(action: {print("Start Timer")}){
               Text("Start")
                   .foregroundColor(.black)
                   .padding(.vertical,20)
                   .padding(.horizontal,90)
                   .background(Color.yellow)
               .cornerRadius(10)
           }
       }
   }
}

まずはここまで、

Text("0.0")

と、

Button()

VStack {}

縦には並べます。

細かい"padding()"などの設定は"."の後に記述することで指定していきます。

画像1

になりました。ここで

 Button(action: {print("Start Timer")}){
               Text("Start")
                   .foregroundColor(.black)
                   .padding(.vertical,20)
                   .padding(.horizontal,90)
                   .background(Color.yellow)
               .cornerRadius(10)
 }

となっていますが、ボタンを押した時の命令がないので追加したいところです。ここで簡単に、別場所に構造体structを作る方法の紹介です。

画像2

Text()の上で⌘クリックするとリストが出てくるので"Extract SubView"を選択すると簡単に関数が出来上がります。

この"struct"を修正していきます。

struct ExtractedView: View {
   var body: some View {
       Text("Start")
           .foregroundColor(.black)
           .padding(.vertical,20)
           .padding(.horizontal,90)
           .background(Color.yellow)
           .cornerRadius(10)
   }
}
var label:String
var buttonColor:Color
var textColor:Color

を作って変数を入れ込みます

  Text(label)
           .foregroundColor(textColor)
           .padding(.vertical,20)
           .padding(.horizontal,90)
           .background(buttonColor)
           .cornerRadius(10)
   }

ContentView()のほうも修正します。

 Button(action: {print("Start Timer")}){
               ExtractedView(label: "Start", buttonColor: .yellow, textColor: .black)
           }

さて、ここで、ストップウオッチの心臓部、"Timer()"を作りますが、これは別ファイルで作ります。StopWatchManeger.swiftというファイルを作ります。

import SwiftUI

class StopWatchManeger{
   var secondsElapsed = 0.0
   var timer = Timer()
   
   func start(){
       timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true){ timer in
           self.secondsElapsed += 0.1
       }
   }
}

ContentViewに戻り、

var stopWatchManeger = StopWatchManeger()

"stopWatchManeger"を使ってタイマー憑依部分を作ります。

String(format:"%.1f",変数)で数値を整形することができます。String(format:)で小数、数字の"0"埋めとかいろいろできます。

Text(String(format:"%1.f",stopWatchManeger.secondsElapsed))

ボタンも"stopWatchManeger"を使って、関数start()を実行するコードを書きます。

Button(action: {self.stopWatchManeger.start()}){}

コード自体はこれ良いのですが、Viewどうしの繋がりを示してやらないと実行されません。プロトコル、Property Wrapperを使っていきます。

StopWatchManeger.swiftですが

"ObservableObject"を適合させます。

class StopWatchManeger:ObservableObject{}

"Property Wrapper"を使います。@Published

@Published var secondsElapsed = 0.0

ContentView.swiftに戻って、"Property Wrapper"をつけます。@ObservedObject

@ObservedObject var stopWatchManeger = StopWatchManeger()

これでデータのやりとりが出来るようになります。

これでスタートボタンを押すと数字が変わっていきます。

画像3

次の回でスタート、ストップ、一時停止のモードを作っていきます。

全コードは


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