SwiftUIのビューの正確なタップポイントのオフセットの位置Xを更新するにはどうすればよいですか?
Nov 21 2020
このRecのドラッグジェスチャでRecオフセットを更新しようとしていますが、Recがドラッグに応じて動き始め、コーディングしたドラッグに従うようにコーディングしました。これで発生する問題は、Recが中央に配置されることです。常にRecを画面の外にドラッグすることはできません。私の目標は、オフセットがタグの位置間で機能し始め、オフセットのソースになるようにコーディングすることです。ソースは中央になり、動的で柔軟になりたいと思っています。 Recをタップします。これをどのようにコーディングする必要がありますか?

struct ContentView: View {
@State var locationX: CGFloat = .zero
let widthOfRec: CGFloat = 200
var body: some View {
Rectangle()
.fill(Color.red)
.frame(width: widthOfRec)
.border(Color.black)
.offset(x: locationX - widthOfRec/2)
.gesture( DragGesture().onChanged { value in locationX = value.location.x })
}
}
回答
Asperi Nov 21 2020 at 18:12
私があなたの目標を正しく理解したなら、あなたは使う必要がありますGestureState
。ジェスチャ状態には一時的な値があり、ジェスチャが終了すると初期値にリセットされます。
これが可能な解決策のデモです。Xcode 12.1 / iOS14.1で作成

struct ContentView: View {
@State var locationX: CGFloat = .zero
@GestureState private var translationX = CGFloat.zero
let widthOfRec: CGFloat = 200
var body: some View {
Rectangle()
.fill(Color.red)
.frame(width: widthOfRec)
.border(Color.black)
.offset(x: locationX + translationX)
.gesture(
DragGesture().updating($translationX) { value, state, _ in
state = value.translation.width
}.onEnded { value in
locationX += value.translation.width
}
)
}
}