Как остановить SwiftUI DragGesture от смерти при просмотре изменений содержимого - PullRequest
1 голос
/ 20 февраля 2020

В моем приложении я перетаскиваю View по горизонтали, чтобы установить положение объекта модели. Я также могу перетащить его вниз и отпустить, чтобы удалить объект модели. Когда он утащен вниз достаточно далеко, я указываю на возможность удаления, изменяя его внешний вид. Проблема в том, что это изменение прерывает DragGesture. Я не понимаю, почему это происходит.

Пример кода ниже демонстрирует проблему. Вы можете перетащить голубую коробку из стороны в сторону. Если вы потянете вниз, он и превратится в образ системы «Лучи», но перетаскивание умрет.

DragGesture применяется к ZStack размером 50x50. ZStack должно продолжать существовать во всем этом состоянии, не так ли? Почему жест перетаскивания умирает?

struct ContentView: View {
    var body: some View {
        ZStack {
            DraggableThing()
        }.frame(width: 300, height: 300)
         .border(Color.black, width: 1)
    }
}

struct DraggableThing: View {

    @State private var willDeleteIfDropped = false
    @State private var xPosition: CGFloat = 150

    var body: some View {
        //Rectangle()
        //    .fill(willDeleteIfDropped ? Color.red : Color.blue.opacity(0.3))
        ZStack {
            if willDeleteIfDropped {
                Image(systemName: "rays")
            } else {
                Rectangle().fill(Color.blue.opacity(0.3))
            }
        }
            .frame(width: 50, height: 50)
            .position(x: xPosition, y: 150)
            .gesture(DragGesture()
                .onChanged { val in
                    print("drag changed \(val.translation)")
                    self.xPosition = 150 + val.translation.width
                    self.willDeleteIfDropped = (val.translation.height > 25)
                }
                .onEnded { val in
                    print("drag ended")
                    self.xPosition = 150
                }
            )
    }
}

1 Ответ

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

Необходимо сохранить контент, в котором изначально зафиксирован жест. Таким образом, ваша цель может быть достигнута с помощью следующих изменений:

ZStack {
    Rectangle().fill(Color.blue.opacity(willDeleteIfDropped ? 0.0 : 0.3))
    if willDeleteIfDropped {
        Image(systemName: "rays")
    }
}
...