
こんにちは!Shoriと申します。この記事では、Swift 5.10およびXcode 15.4を使用して、SwiftUIでtoggle()を使用して値を切り替える方法について、サンプルコードを交えながら説明しております。
初心者の方でも分かりやすいように、サンプルコードに適宜説明を入れながら解説していくので、ぜひご覧ください。
この記事を読んで分かること…
・toggle()の使い方
・.toggleStyle()を用いた.toggleのカスタマイズの方法
・makeBodyを用いた.toggleのカスタマイズの方法
実行環境
・実行環境:SwiftUI+XCode
・Swift:5.10
・XCode:15.4
・サンプルコードの実行確認日:2024年12月30日(月)
※ 今回紹介するtoggle()は、iOS13.0+, macOS10.15+以上で動作しますので、それ未満の場合はOSのアップデートが必要な場合があります。
toggleとは?
struct Toggle<Label> where Label : View
toggleは変数のONとOFFを切り替えることの出来る制御部品です。
Toggleを使ってみよう(.switch)
実装イメージ
今回実装するボタンのイメージ図は下記の通りです。通信が多く発生するアプリにおいて、通信量を削減するために通信モードを切り替えるための部品を実装する、という状況を想定して実装を行います。


サンプルコード
import SwiftUI
struct BlogView: View {
@State private var isUnlocked: Bool = false
var body: some View {
Toggle(isOn: $isUnlocked) {
Text("通信量を削減する \n \(isUnlocked)")
}
.padding(16)
.toggleStyle(.switch)
}
}
#Preview {
BlogView()
}
サンプルコードの説明
◾️行 1: SwiftUI
をインポートしています。
◾️行 2: @State
を付けて変数の値の状態変更を監視します。またprivate
修飾子をつけることで、他のファイルからのアクセスを制限します。Bool
型のisUnlocked
という変数を定義します。
◾️行 4: Toggle
を宣言します。isOn
を引数に取り、その中にisUnlocked
を代入します。その際にBinding<Bool>
型に変換する必要があるため、行頭に$
を付けておきます。
◾️行 4~5: Toggle
のブラケットの中でText
を宣言します。ラベルを改行することで、isUnlocked
の値が更新されたら2行目に表示されるようにします。
◾️行 6: 余白を16に設定します。
◾️行 7: .toggleStyle(.switch)
を指定することで、通常のToggleのスタイルを適用することができます。#PreView
・ここでBlogViewを初期化してあげることで、XCodeの右部分にリアルタイムプレビューを表示させることが可能となります。
出力




ラベルの2行目がtrueになっていることが確認できる。
トグルを押したことで、Boolの値が更新されていることが確認できました。
toggleを使ってみよう(.button)
今回は、先ほどのコードで指定した.toggleStyleの中身を変更して起動してみましょう。
概要
.toggleStyle(.button)
.toggleStyleには引数に、.button, .switch, Configuration, .automatic, makeBody()を取ることができます。
※ .automatic, makeBody()はこの記事で紹介するものと内容が重複するため、この記事では割愛します。
サンプルコード
import SwiftUI
struct BlogView: View {
@State private var isUnlocked: Bool = false
var body: some View {
Toggle(
"通信量を削減する",
systemImage: "dot.radiowaves.left.and.right",
isOn: $isUnlocked
)
.padding(16)
.toggleStyle(.button)
}
}
#Preview {
BlogView()
}
また、今回はtoggleの書き方も変更してみましょう。toggleは引数を3つ取ることが可能で、画像もtoggleに使うことができます。
サンプルコードの説明
◾️行 1: SwiftUI
をインポートしています。
◾️行 2: @State
を付けて変数の値の状態変更を監視します。またprivate
修飾子をつけることで、他のファイルからのアクセスを制限します。Bool
型のisUnlocked
という変数を定義します。
◾️行 4: Toggle
を宣言します。
・第1引数: ラベルに表示するTextを宣言します。
・第2引数:Image()の中でsystemImageを引数に取り、任意の画像を指定します。
・第3引数:isOn
を引数に取り、その中にisUnlocked
を代入します。その際にBinding<Bool>
型に変換する必要があるため、行頭に$
を付けておきます。
◾️行 8: 余白を16に設定します。
◾️行 9: .toggleStyle(.button)
を指定することで、特殊なToggleのスタイルを適用することができます。#PreView
・ここでBlogViewを初期化してあげることで、XCodeの右部分にリアルタイムプレビューを表示させることが可能となります。
出力




全体に薄いブルーの背景色が適用された
トグルを押したことで、Toggleが更新されていることが確認できました。
toggleを使ってみよう(CustomToggleStyle)
今回も、先ほどのコードで指定した.toggleStyleの中身を変更して起動してみましょう。
概要
.toggleStyle(CustomToggleStyle())
CustomToggleStyle()を使うことで、カスタマイズしたViewを渡すことができます!
サンプルコード
import SwiftUI
struct BlogView: View {
@State private var isUnlocked: Bool = false
var body: some View {
Toggle(
"ボタンを押して録音",
isOn: $isUnlocked
)
.padding(16)
.toggleStyle(CustomToggleStyle())
}
}
struct CustomToggleStyle: ToggleStyle {
func makeBody(configuration: Configuration) -> some View {
HStack {
configuration.label
Spacer()
switch configuration.isOn {
case true:
Rectangle()
.fill(.blue)
.frame(width: 30, height: 30)
case false:
Circle()
.fill(.red)
.frame(width: 30, height: 30)
}
}
.onTapGesture {
configuration.isOn.toggle()
}
}
}
#Preview {
BlogView()
}
サンプルコードの説明
// BlogView
◾️行 1: SwiftUI
をインポートしています。
◾️行 2: @State
を付けて変数の値の状態変更を監視します。またprivate
修飾子をつけることで、他のファイルからのアクセスを制限します。Bool
型のisUnlocked
という変数を定義します。
◾️行 4: Toggle
を宣言します。isOn
を引数に取り、その中にisUnlocked
を代入します。その際にBinding<Bool>
型に変換する必要があるため、行頭に$
を付けておきます。
◾️行 4~5: Toggle
のブラケットの中でText
を宣言します。ラベルを改行することで、isUnlocked
の値が更新されたら2行目に表示されるようにします。
◾️行 8: 余白を16に設定します。
◾️行 9: .toggleStyle(CustomToggleStyle())
を指定することで、CustomToggleStyle()のスタイルを適用することができます。
CustomToggleStyle
◾️行 1: ToggleStyle
を継承します。
◾️行 2: Configuration
を引数に取るmakeBody()
という名前のメソッドを定義します。その際、メソッドの名前は必ずmakeBody()
にする必要があります。
◾️行 3~: HStack
を宣言します。そのブラケットの中でconfiguration.label
とSpacer()
とShape()
を横並びに並べます。左から順番にToggle
に使うlabel
、自動にスペースを調整するためのSpacer()
、最後にToggle
のために使うRectangle()
とCircle()
を定義します。
◾️行 7~: configuration.isOn
を使うことで、Toggle
のon/offを検知することができます。false
であれば、sizeが30で赤い丸を描画します。一方でtrue
であれば、sizeが30の青い丸を描画します。
◾️行 17~: onTapGesuture
を用いて、タップ検知イベントを実装します。toggle
メソッドを用いて、Configuration.isOn
を切り替えます。この行で、falseであればtrueに、trueであればfalseを返却するようにします。
#PreView
・ここでBlogViewを初期化してあげることで、XCodeの右部分にリアルタイムプレビューを表示させることが可能となります。
出力




タップした図形が赤い丸から青い四角に変更された
まとめ
いかがでしたでしょうか?
この記事では、変数の切り替えを行うWidget・toggle()について、通常の使い方からmakeBodyや.toggleStyle()を用いてカスタマイズする解説を行いました。
ではまた、次の記事でお会いしましょう!



この記事があなたのスキルアップに役立ったなら、次のキャリアステップを踏み出す絶好の機会かもしれません。エンジニアとしてのさらなる成長と挑戦を求めるなら、未経験からエンジニア転職なら【Tech Stars Agent】をオススメします!
コメント