전체 코드
@State private var dragOffset = CGSize.zero
@State private var dragOffset2 = CGSize.zero
var body: some View {
Image(systemName: "person.fill")
.font(.largeTitle)
.offset(x: dragOffset.width , y:dragOffset.height )
.gesture(DragGesture()
.onChanged { gesture in
dragOffset = CGSize(width: gesture.translation.width + dragOffset2.width, height: gesture .translation.height + dragOffset2.height)
}
.onEnded { gesture in
dragOffset = CGSize(width: gesture.translation.width + dragOffset2.width, height: gesture .translation.height + dragOffset2.height)
dragOffset2 = dragOffset
})
}
onChanged
- onChanged에서 사용할 변수 gesture 선언
onChanged { gesture in }
- translation은 아이콘이 현 위치에서 얼마나 움직인 지를 알려준다
그러므로 dragOffset의 width와 height는 아이콘의 좌표(dragOffset2)와 드래그를 실행하면서 움직이는 좌표를 더하여 움직이는 만큼 아이콘을 움직이게 보여준다.
dragOffset = CGSize(width: gesture.translation.width + dragOffset2.width, height: gesture .translation.height + dragOffset2.height)
onEnded
- onChanged에서 현재 위치를 dragOffset에 지정을 해주었는데 dragOffset은 결국 다시 움직일 때 현 위치에서 변경된 값을 저장하기 위해 사용해야 하므로 dragOffset2에 현 위치를 저장시킨다.
dragOffset2 = dragOffset