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
                }
            )
    }
}