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 | ドラッグ速度に基づく最終の予測移動量 |
これらの情報をもとに、ユーザーが右へドラッグしたのか、左へドラッグしたのかなどの判定をおこなうことができる。