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