Реализация жеста перетаскивания
Пытаясь сделать простой жест перетаскивания без долгого нажатия, я обнаружил, что два разных способа дают одинаковый результат. Я не уверен, что один метод предпочтительнее другого или оба одинаково действительны.
Пример 1
Здесь я использовал значения @State CGSize для представления как viewState, так и dragState
struct Example1: View {
@State var viewState: CGSize = .zero
@State var dragState: CGSize = .zero
var body: some View {
let dragGesture = DragGesture()
.onChanged { (value) in
self.dragState = value.translation
}.onEnded { (value) in
self.viewState.width += value.translation.width
self.viewState.height += value.translation.height
self.dragState = .zero
}
return Circle().foregroundColor(.blue).frame(width: 20, height: 20)
.offset(x: dragState.width + viewState.width,
y: dragState.height + viewState.height)
.gesture(dragGesture)
}
}
Пример 2
На этот раз я сделал структуру похожей на статью Composing SwiftUI Gestures, но без длинного нажатия.
struct Example2: View {
@State var viewState: CGSize = .zero
@GestureState var dragState: DragState = .inactive
enum DragState {
case inactive
case active(translation: CGSize)
var translation: CGSize {
switch self {
case .active(translation: let translation):
return translation
default:
return .zero
}
}
}
var body: some View {
let dragGesture = DragGesture()
.updating($dragState) { (value, state, _) in
state = .active(translation: value.translation)
}.onEnded { (value) in
self.viewState.width += value.translation.width
self.viewState.height += value.translation.height
}
return Circle().foregroundColor(.red).frame(width: 20, height: 20)
.offset(x: dragState.translation.width + viewState.width,
y: dragState.translation.height + viewState.height)
.gesture(dragGesture)
}
}
Основной вопрос
Делает ли какая-либо из этих реализаций что-то под капотом, что мне не хватает, или они точно такие же?