SwiftUI - обнаружение отмены DragGesture, когда док-станция для iPad поднята - PullRequest
1 голос
/ 17 февраля 2020

Вот очень простой пример, чтобы показать, что я пытаюсь сделать. Красный круг можно перетаскивать, и когда он отпущен, он go вернется в исходное место, как показано на первом изображении. Проблема возникает, когда док-станция iPad поднимается в середине перетаскивания, и тогда DragGesture .onEnded никогда не будет вызываться, а красный кружок застрянет, как показано на втором изображении. Я не понимаю, почему .onEnded не называется. Чего мне здесь не хватает?

Я подумал об обходном пути, сбросив offset в sceneDidBecomeActive SceneDelegate, но он не работает, если док-станция для iPad только поднята, но не приводит к тому, что приложение становится неактивен, т.е. идет в фоновый режим. В этом случае никакие функции в SceneDelegate не будут вызываться, и я считаю невозможным обнаружить, что DragGesture был прерван. Любое возможное решение?

struct ContentView: View {
  @State private var offset = CGSize.zero

  var body: some View {
    ZStack {
      Rectangle()
        .fill(Color.clear)
        .frame(width: 100, height: 100)
        .border(Color.black, width: 5)

      Circle()
        .fill(Color.red)
        .frame(width: 90, height: 90)
        .offset(offset)
        .gesture(
          DragGesture()
            .onChanged() { self.offset = $0.translation }
            .onEnded() { _ in self.offset = CGSize.zero })
    }
  }
}

Image 1

Image 2

1 Ответ

1 голос
/ 17 февраля 2020

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

struct ContentView: View {
  @GestureState private var offset = CGSize.zero

  var body: some View {
    ZStack {
      Rectangle()
        .fill(Color.clear)
        .frame(width: 100, height: 100)
        .border(Color.black, width: 5)

      Circle()
        .fill(Color.red)
        .frame(width: 90, height: 90)
        .offset(offset)
        .gesture(
          DragGesture()
            .updating($offset) { (value, gestureState, transaction) in
                gestureState = CGSize(width: value.location.x - value.startLocation.x, height: value.location.y - value.startLocation.y)
            })
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...