SwiftUIのPickerの使い方と、覚えておくと便利なPickerの種類

Swift

何かと使用することが多いPickerをSwiftUIで実装する方法について説明します。

開発環境

  • Xcode 12.5.1
  • Swift5.4
  • iOS14.6

使い方

参考にしたのは毎度お馴染みApple公式ドキュメントです。

Pickerを表示するには、以下を使用します。

struct Picker<Label, SelectionValue, Content> where Label : View, SelectionValue : Hashable, Content : View

使用方法はとても簡単です。3色の中から色を選ぶサンプルを作ってみましょう。

struct ContentView: View {
    @State private var selectedValue = 1
    var body: some View {
        VStack {
            Picker("色を選択", selection: $selectedValue) {
                Text("赤").tag(1)
                Text("青").tag(2)
                Text("黄色").tag(3)
            }
        }
    }
}

第1引数の “色を選択” と書いていますが、Form内にPickerを組み込んだ際に表示される項目名なので、この実装の仕方では表示されません。

第2引数はPickerで選択されているtagの値を格納する変数を設定してあげます。こうすることで、Pickerで値を選択するたびに selectedValue に選択した値が入ります。

実行してみるとこんな感じ

簡単に実装できました。

せっかくなので、選択している色に合わせて背景色を変えてみましょう。

struct ContentView: View {
    @State private var selectedValue = UIColor.red
    var body: some View {
        ZStack {
            Color(selectedValue)
                .edgesIgnoringSafeArea(.all)
            
            VStack {
                Picker("色を選択", selection: $selectedValue) {
                    Text("赤").tag(UIColor.red)
                    Text("青").tag(UIColor.blue)
                    Text("黄色").tag(UIColor.yellow)
                }
            }
        }
    }
}

ZStackを使って背景色を設定し、selectedValue にUIColorを持たせるようにして、PickerのtagもUIColorを渡すように変更しました。

結果はこんな感じ

目がチカチカする〜

Pickerの種類

上のようなホイールタイプのPicker以外にも、いくつか種類があるので紹介します。

WheelPickerStyle

Pickerとして一般的なホイールタイプのPicker。

SegmentedPickerStyle

選択しを横に並べたタイプのPicker。

MenuPickerStyle

Pickerの第1引数に設定したテキストのボタンが表示され、そのボタンを押すとポップアップで選択肢が表示されるタイプのPicker。

NavigationViewとFormを使ったPicker

以下のようにNavigationViewとFormを使用して実装をすると、選択肢をListのように表示できます。

struct ContentView: View {
    @State private var selectedValue = UIColor.red
    var body: some View {
        NavigationView {
            Form {
                Picker("色を選択", selection: $selectedValue) {
                    Text("赤").tag(UIColor.red)
                    Text("青").tag(UIColor.blue)
                    Text("黄色").tag(UIColor.yellow)
                }
            }
        }
    }
}

用途に合わせて適切なスタイルを使用して、ユーザーにとって使いやすいアプリになるよう心がけましょう。

コメント