SwiftUIでドラッグした時の処理を追加する場合は、gestureモディファイアとDragGesture構造体を使う。

今回はDragGesture構造体を使って、ドラッグ中の座標情報などを取得する簡単な例を紹介する。

サンプルコード

struct ContentView: View {
  // 絶対座標を格納
  @State var location = ""
  
  // 元の位置からの相対座標を格納
  @State var translation = ""
  
  var body: some View {
    ZStack {
      Image("pasta")
        .resizable()
        .scaledToFit()
        .gesture(
          DragGesture().onChanged { value in
            // ドラッグ中の処理
            self.location = "\(value.location)"
            self.translation = "\(value.translation)"
          }.onEnded { value in
            // ドラッグ終了時の処理
            self.location = "\(value.location)"
            self.translation = "\(value.translation)"
          }
      )
      
      VStack(alignment: .leading) {
        Text("location: \(location)")
        Text("translation: \(translation)")
        Spacer()
      }
    }
  }
}

この例ではDragGesture構造体のonChangedメソッド、onEndedメソッドを使って、取得したvalueインスタンスの情報を表示させている。

onChangedメソッドは、インスタンスの値が変更された時、つまりドラッグ中に実行され、onEndedメソッドはドラッグ終了時に実行される。

今回はインスタンスの情報のうち一部しか使っていないが、他にも以下のプロパティが用意されている。

timeドラッグに関連付けされた時間
location現在ドラッグしている位置
startLocationドラッグ開始位置
translationドラッグ開始から現在位置までの移動量
predictedEndLocationドラッグ速度に基づく最終の予測位置
predictedEndTranslationドラッグ速度に基づく最終の予測移動量

これらの情報をもとに、ユーザーが右へドラッグしたのか、左へドラッグしたのかなどの判定をおこなうことができる。