この記事では、Toggleの実装方法について徹底解説していきたいと思います。
Contents
Toggleとは?
SwiftUIのToggleというのは、UIKitで言うSwitchのことです。ON/OFFを切り替えられるアレです。
タップすると切り替わります。(よくスワイプする人がいますが意味ないです)
緑色がONの状態で、グレーがOFFの状態です。
実装方法は簡単で、@State
のBool型を宣言して、Toggle("Toggle", isOn: $flag)
だけで実装できます。
Toggleの色々な使い方
シンプル
struct ContentView: View { @State private var flag = true var body: some View { Toggle("Toggle", isOn: $flag) .padding() } }
文字なし
struct ContentView: View { @State private var flag = true var body: some View { Toggle("", isOn: $flag) .labelsHidden() } }
文字なし(ただ空にするだけ)
struct ContentView: View { @State private var flag = true var body: some View { Toggle("", isOn: $flag) .padding() } }
文字あり(値を使う場合)
struct ContentView: View { @State private var flag = true var body: some View { Toggle(isOn: $flag) { Text(flag ? "ON" : "OFF") } .padding() } }
ボタンスタイルのToggle
struct ContentView: View { @State private var flag = true var body: some View { Toggle(isOn: $flag) { Text(flag ? "ON" : "OFF") } .toggleStyle(.button) .padding() } }
struct ContentView: View { @State private var flag = true var body: some View { VStack { Toggle("大きいボタン", isOn: $flag) .toggleStyle(.button) .controlSize(.large) .padding() Toggle("赤色のボタン", isOn: $flag) .toggleStyle(.button) .tint(.red) .padding() } } }
ちなみに、デフォルトは.toggleStyle(.switch)
です。
Toggleの色を変える
struct ContentView: View { @State private var flag = false var body: some View { Toggle("Toggle", isOn: $flag) .toggleStyle(SwitchToggleStyle(tint: .red)) .padding() } }
.tint(.red)
でもOKです。
スタイルを自作する
struct ContentView: View { @State private var flag = false var body: some View { Toggle("Toggle", isOn: $flag) .toggleStyle(CheckBoxToggleStyle()) .padding() } } struct CheckBoxToggleStyle: ToggleStyle { func makeBody(configuration: Configuration) -> some View { Button { configuration.isOn.toggle() } label: { HStack { configuration.label Spacer() Image(systemName: configuration.isOn ? "checkmark.circle.fill" : "circle") } } } }
以下のようにToggleStyle
に対して、func makeBody
でToggleのスタイルを自作することができます。
struct MyToggleStyle: ToggleStyle { func makeBody(configuration: Configuration) -> some View { // ここにToggleのデザインを記述する } }
値変更時のイベント取得
.onChange
で値が変わったときのイベントが取得できます。ここで値を保存したりしましょう。
struct ContentView: View { @State private var flag = true var body: some View { Toggle("Toggle", isOn: $flag) .padding() .onChange(of: flag) { newValue in print("値が変わったよ:\(newValue)") } } }
値の初期値を変更する
flagの初期値を取得して、.onAppear
で値を入れるだけです。
struct ContentView: View { @State private var flag = true var body: some View { Toggle("Toggle", isOn: $flag) .padding() .onAppear { flag = false } } }
参考文献