Вот очень простой пример, чтобы показать, что я пытаюсь сделать. Красный круг можно перетаскивать, и когда он отпущен, он 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 })
}
}
}

