SwiftUIでは、onLongPressGestureモディファイアを使うことで、ロングタップ(長押し)時の処理をビューに適用することができる。

それでは早速サンプルコードを見ていこう。

struct ContentView: View {
  @State var showImage = false
  
  var body: some View {
    HStack {
      Text("Long tap")
        .onLongPressGesture(pressing: { press in
          print("pressing: \(press)")
        }) {
          print("perform")
          self.showImage.toggle()
      }
      
      if showImage {
        Image(systemName: "star")
      }
    }
  }
}

Textビューを長押しすることでImageビューの表示・非表示を切り替える簡単なサンプルだ。

今回の例では、onLongPressGestureモディファイアのpressing引数のみを設定しているが、他に以下の引数を指定することができる。

minimumDurationロングタップ判定の最小時間
初期値は0.5秒
maximumDistanceロングタップ判定の最大距離
長押し中にずれても許容する距離を指定
初期値は10ポイント
pressingボタンが押された時と、離れた時、
それぞれのタイミングで実行する処理

サンプルコードではprint文の記述がいくつかあるが、xcodeの通常のプレビュー機能ではprint文の出力を確認することができない。

そこで、プレビューボタン上で右クリックして表示されるコンテキストメニューから「Debug Preview」を選択し実行する必要がある。

こうすることでデバッグモードが有効になり、print文の結果を確認することができる。

pressing引数で指定したとおり、まず長押しが始まったタイミングでtrue、指を離したタイミングでfalseが出力されており、そして最後にonLongPressGestureの処理が走っていることが分かる。