LoginSignup
4
5

More than 3 years have passed since last update.

【SwiftUI】contextMenuで長押ししたときにメニューを出す

Posted at

先日リリースしたアプリに使用した技術をひとつずつ解説しています。
私のアプリはこちら。

contextMenuとは

任意のビューに対し、長押ししたときにメニューを出す機能を追加するメソッド。

実際の動作

実際にアプリを触らないとわかりづらいかもしれませんが、長押しすることでメニューが表示されています。また、メニューの外側をタップするとメニューが閉じるようになっています。
iOSアプリでよく見かける機能ではないでしょうか。

ソースコード

ContentView.Swift
import SwiftUI

struct ContentView: View {
    let evs = ["イーブイ", "ブースター", "シャワーズ", "サンダース", "エーフィ", "ブラッキー", "グレイシア", "リーフィア", "ニンフィア"]
    let colors1: [Color] = [Color(#colorLiteral(red: 0.7254902124, green: 0.4784313738, blue: 0.09803921729, alpha: 1)), .red, .blue, .yellow, Color(#colorLiteral(red: 0.8446564078, green: 0.5145705342, blue: 1, alpha: 0.5)), .black, Color(#colorLiteral(red: 0.6872052062, green: 0.9808971643, blue: 1, alpha: 1)), Color(#colorLiteral(red: 0.5843137503, green: 0.8235294223, blue: 0.4196078479, alpha: 1)), .pink]
    let colors2: [Color] = [.white, .white, .white, .black, .black, .yellow, .blue, Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)), Color(#colorLiteral(red: 0.4745098054, green: 0.8392156959, blue: 0.9764705896, alpha: 1))]

    @State var evID = 0

    var body: some View {
        ZStack{
            Circle()
                .foregroundColor(colors1[evID])
                .frame(width: 250)
            VStack{
                Image(systemName: "sparkles") //このビューを長押しするとメニューが現れるようにする
                    //ここからがコンテキストメニュー
                    .contextMenu(menuItems: {
                        ForEach(0..<9) { n in
                            Button(action: {
                                evID = n
                            }, label: {
                                Text(evs[n])
                            })
                        }
                    })
                    //ここまでがコンテキストメニュー
                Text(evs[evID])
                    .padding()
            }
            .font(.title)
            .foregroundColor(colors2[evID])
        }
    }
}

「長押しするとメニューが出る」という機能を追加したいビューに対して.contextMenuを書きます。
そして、contextMenuの引数であるmenuItemsの{}内が、表示されるメニューの内容になります。

menuItemsには何を書く?

contextMenuでTextSF Symbolsを使ったImageを表示させることができます。しかし、書いたものを自動的にボタンにする、という機能はありません。上のサンプルアプリのようにcontextMenuにボタンを表示させたい場合は、menuItemsにはButtonビューを書くのが良いでしょう。

まとめ

簡単なコードでおもしろくて便利な機能を実現できます。ぜひ、SwiftUIでcontextMenuを使ってみてください。

よかったらTwitterのフォローをお願いします。
https://twitter.com/masayoshi_tozan

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5