.onDrag 모디파이어는 드래그가 아닌 드래그 앤 드랍을 구현할 때 사용
드래그 제스처는 직접 만들어야 함.
var dragGesture: some Gesture {
DragGesture()
.onChanged { value in //드래그 인식 후 터치 움직이면 해당 클로저 반복 호출
//새로운 상태가 value를 통해 전달됨
}
.onEnded { value in //드래그가 끝나면 호출. value에는 마지막 상태 저장
}
}
minimumDistance: 드래그로 인식되는 최소한의 이동 거리. 기본값 10(pt). 이 거리 이상으로 드래그 시 좌표가 반복적으로 전달됨.coordinateSpace: 어떤 좌표체계를 사용할 지 전달..local: 제스처가 추가되어있는 뷰의 좌표 체계 (기본값).global: 전역 좌표체계..gesture(dragGesture)
var dragGesture: some Gesture {
DragGesture()
.onChanged { value in //드래그 인식 후 터치 움직이면 해당 클로저 반복 호출
//새로운 상태가 value를 통해 전달됨
currentTranslation = value.translation
}
.onEnded { value in //드래그가 끝나면 호출. value에는 마지막 상태 저장
currentTranslation = .zero
//드래그를 끝냈을 때 가장 마지막 거리 저장됨
//이 상태에서 재 드래그 시 속성에 저장되어있는 거리만큼 offset 추가됨
//터치 위치와 서클 위치가 어긋나게 됨을 방지키 위해 저장
var t = finalTranslation
t.width += value.translation.width
t.height += value.translation.height
finalTranslation = t
}
}
@State private var currentTranslation = CGSize.zero
@State private var finalTranslation = CGSize.zero //드래그 끝냈을 때 위치 보존 위한 속성
var body: some View {
VStack {
Circle()
.foregroundColor(.yellow)
.frame(width: 100, height: 100)
.offset(finalTranslation) //드래그 끝냈을 때 위치 보존 위함
.offset(currentTranslation)
.gesture(dragGesture)
}
}
offset 모디파이어 다음에 gesture 모디파이어를 사용해야 한다.gesture 모디파이어는 마지막에 추가하는 것이 좋다.앞서 Translation을 저장하기 위해 State variable을 사용했다. 그러나, 이런 속성들은 GestureState로 선언 가능
GestureState 속성은 드래그가 끝나는 시점에 기본값으로 자동 초기화된다. var dragGesture: some Gesture {
DragGesture()
.updating($currentTranslation, body: { value, state, transaction in
//value: 제스처 상태
//state: 입출력용. 바인딩 속성 전달
//transaction: 제스처에 대한 부가정보, 보통 animation context
state = value.translation
})
.onEnded { value in //드래그가 끝나면 호출. value에는 마지막 상태 저장
//드래그를 끝냈을 때 가장 마지막 거리 저장됨
//이 상태에서 재 드래그 시 속성에 저장되어있는 거리만큼 offset 추가됨
//터치 위치와 서클 위치가 어긋나게 됨을 방지키 위해 저장
var t = finalTranslation
t.width += value.translation.width
t.height += value.translation.height
finalTranslation = t
}
}
@GestureState private var currentTranslation = CGSize.zero
@State private var finalTranslation = CGSize.zero //드래그 끝냈을 때 위치 보존 위한 속성