SwiftUI에서보기에 대한 정확한 탭 포인트의 오프셋 위치 X를 어떻게 업데이트 할 수 있습니까?

Nov 21 2020

이 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 / iOS 14.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
                }
            )
    }
}