SwiftUI: Wie gehe ich mit BEIDEM Tippen und langem Drücken der Taste um?

11

Ich habe eine Schaltfläche in SwiftUI und möchte eine andere Aktion für "Tippen auf die Schaltfläche" (normales Klicken / Tippen) und "Langes Drücken" ausführen können.

Ist das in SwiftUI möglich?

Hier ist der einfache Code für die Schaltfläche, die ich jetzt habe (behandelt nur den "normalen" Tap / Touch-Fall).

Button(action: {self.BLEinfo.startScan() }) {
                        Text("Scan")
                    } .disabled(self.BLEinfo.isScanning)

Ich habe bereits versucht, eine "longPress-Geste" hinzuzufügen, aber sie "führt" immer noch nur den "normalen / kurzen" Klick aus. Dies war der Code, den ich ausprobiert habe:

Button(action: {self.BLEinfo.startScan() }) {
                        Text("Scan")
                            .fontWeight(.regular)
                            .font(.body)
                        .gesture(
                            LongPressGesture(minimumDuration: 2)
                                .onEnded { _ in
                                    print("Pressed!")
                            }
                        )
                    }

Vielen Dank!

Gerard

Gerard
quelle

Antworten:

15

Ich habe viele Dinge ausprobiert, aber schließlich habe ich so etwas gemacht:

    Button(action: {
    }) {
        VStack {
            Image(self.imageName)
                .resizable()
                .onTapGesture {
                    self.action(false)
                }
                .onLongPressGesture(minimumDuration: 0.1) {
                    self.action(true)
                }
        }
    }

Es ist immer noch eine Taste mit Effekten, aber kurzes und langes Drücken sind unterschiedlich.

Norekhov
quelle
3
Bitte beachten Sie, dass ab Xcode 11.2.1 / iOS 13.2 die Reihenfolge hier wichtig zu sein scheint. Wenn Sie onLongPressGesture()before verwenden, onTapGesture()wird letzteres ignoriert.
Koraktor
Dies hat nicht die Animation, den Code zu tippen oder zu drücken und zu blockierenaction
Faruk
3

Ich habe gerade festgestellt, dass der Effekt von der Reihenfolge der Implementierung abhängt. Durch die Implementierung der Erkennung von Gesten in der folgenden Reihenfolge scheint es möglich zu sein, alle drei Gesten zu erkennen und zu identifizieren:

  1. Handle eine doppelte Geste
  2. Behandle eine longPressGesture
  3. eine einzelne Tippgeste handhaben

Getestet auf Xcode Version 11.3.1 (11C504)

    fileprivate func myView(_ height: CGFloat, _ width: CGFloat) -> some View {
    return self.textLabel(height: height, width: width)
        .frame(width: width, height: height)
        .onTapGesture(count: 2) {
            self.action(2)
        }
        .onLongPressGesture {
            self.action(3)
        }
        .onTapGesture(count: 1) {
            self.action(1)
        }
}
Andreas Vogel
quelle
1

Dies wird nicht getestet, aber Sie können versuchen LongPressGesture, Ihrer Schaltfläche eine hinzuzufügen .

Es wird vermutlich so aussehen.

struct ContentView: View {
    @GestureState var isLongPressed = false

    var body: some View {
        let longPress = LongPressGesture()
            .updating($isLongPressed) { value, state, transaction in
                state = value
            }

        return Button(/*...*/)
            .gesture(longPress)
    }
}
Kilian
quelle
Hallo Kilian Eigentlich hätte ich erwähnen sollen, dass ich bereits versucht habe, eine LongPress-Geste hinzuzufügen, aber sie wird immer noch nur die Aktion "Normales Klicken" und nicht das lange Drücken ausführen. Ich werde meinen Beitrag bearbeiten, um das hinzuzufügen (da Sie die zweite Person sind, die dies vorschlägt - der erste hat seine Antwort gelöscht).
Gerard