【SwiftUI】true/falseの入力・トグルの作成

この記事は約6分で読めます。

SwiftUIにおける入力フォームを作成する際に、ON/OFFの2つの状態を持たせたい場合は“トグル”を使用すると便利です。
トグルを使用することで以下のような入力フォームを作成できます。

対応バージョン

iOS13.0以上
XCode(当サイトの環境)13.4.1

コード例

トグルでON/OFFを入力、状態を保持することもできる
import SwiftUI

struct ToggleSample: View {
    @State private var toggleState = false
    var body: some View {
        VStack {
            Toggle("ToggleState", isOn: $toggleState)
        }
        //トグルのスタイルを指定
        .toggleStyle(.switch)
    }
}

トグルのカスタマイズ例

toggleStyleモディファイアを使用すると、トグルの外観を変更することができます。

import SwiftUI

struct ToggleSample: View {
    @State private var toggleState = false
    var body: some View {
        VStack {
            Toggle("トグルの状態", isOn: $toggleState)
        }
        //トグルのスタイルを指定
        .toggleStyle(.button)
    }
}

buttonスタイル

.buttonを指定すると以下のような見た目に変更されます。

トグルOFFの状態
タップするとONになる

スタイルの自作

appleの開発サイトを参考にToggleStyleの自作方法を紹介します。

スタイルの作成は、ToggleStyleプロトコルを使用して作成することができます。
ToggleStyleプロトコルでは”func makeBody”を宣言して、その中に作成したいViewを定義していきます。

import SwiftUI

struct ToggleSample: View {
    @State private var toggle1State = false
    @State private var toggle2State = false
    var body: some View {
        VStack {
            Toggle("トグル1の状態", isOn: $toggle1State)
            Toggle("トグル2の状態", isOn: $toggle2State)
                
        }
        //トグルのスタイルを指定
        .toggleStyle(CheckToggleStyle())
    }
}

struct CheckToggleStyle: ToggleStyle {
    func makeBody(configuration: Configuration) -> some View {
        Button {
            //Toggleスタイルのプロパティでラベルとトグルの状態にアクセスできる
            configuration.isOn.toggle()
        } label: {
            HStack {
                //システムアイコンを使用する
                Image(systemName: configuration.isOn
                        //toggleがtrueの時の表示
                        ? "checkmark.circle.fill"
                        //toggleがfalseの時の表示
                        : "circle")
                //toggleのラベル
                configuration.label
            }
        }
        //以下はトグルの見栄えを変更するモディファイア
        //tintは色を変更できる
        .tint(.primary)
    }
}

システムアイコンの画像を変更すればチェックボックスのデザインも変更できる

“checkmark.circle.fill”→”checkmark.square”に変更すると以下のようなチェックボックスとなります。

//システムアイコンを使用する
Image(systemName: configuration.isOn
     //toggleがtrueの時の表示
     ? "checkmark.square"
      //toggleがfalseの時の表示
      : "square")

チェックマークのデザイン例

元々、以下のような選択肢にチェックマークを重ねたデザインを使用したかったため、トグル機能を調べていました。

.overlayを使用することで、やりたかったことが実現できそうです。参考までにコード例を載せておきます。

struct CheckMarkToggleStyle: ToggleStyle {
    func makeBody(configuration: Configuration) -> some View {
        Button {
            //Toggleスタイルのプロパティでラベルとトグルの状態にアクセスできる
            configuration.isOn.toggle()
        } label: {
            HStack {
                //toggleのラベル
                configuration.label
                    .overlay(
                        //システムアイコンを使用する
                        Image(systemName: configuration.isOn
                        //toggleがtrueの時の表示
                        ? "checkmark"
                        //toggleがfalseの時の表示
                        : "")
                            .foregroundColor(.red)
                            .font(.system(size: 40))
                )
            }
        }
        //以下はトグルの見栄えを変更するモディファイア
        //tintは色を変更できる
        .tint(.primary)
    }
}
タイトルとURLをコピーしました