Есть ли важное различие между этими двумя реализациями жеста перетаскивания SwiftUI? - PullRequest
0 голосов
/ 10 ноября 2019

Реализация жеста перетаскивания

Пытаясь сделать простой жест перетаскивания без долгого нажатия, я обнаружил, что два разных способа дают одинаковый результат. Я не уверен, что один метод предпочтительнее другого или оба одинаково действительны.

Пример 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)
    }
}

Основной вопрос

Делает ли какая-либо из этих реализаций что-то под капотом, что мне не хватает, или они точно такие же?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...