SwiftUI: come gestire ENTRAMBI i tocchi e la pressione prolungata del pulsante?


11

Ho un pulsante in SwiftUI e vorrei poter eseguire un'azione diversa per "pulsante tocco" (clic / tocco normale) e "pressione lunga".

È possibile in SwiftUI?

Ecco il semplice codice per il pulsante che ho ora (gestisce solo il caso "normale" di tocco / tocco).

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

Ho già provato ad aggiungere un "gesto longPress" ma continua a "eseguire" solo il clic "normale / breve". Questo era il codice che ho provato:

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

Grazie!

Gerard

Risposte:


15

Ho provato molte cose ma alla fine ho fatto qualcosa del genere:

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

È ancora un pulsante con effetti ma la pressione breve e lunga sono diverse.


3
Si noti che a partire da Xcode 11.2.1 / iOS 13.2 l'ordine sembra essere importante qui. L'uso di onLongPressGesture()before onTapGesture()ignorerà quest'ultimo.
Koraktor,

questo non ha l'animazione di toccare o premere e bloccare il codice inaction
Faruk

3

Ho appena scoperto che l'effetto dipende dall'ordine di implementazione. Implementando il rilevamento di gesti nel seguente ordine sembra essere possibile rilevare e identificare tutti e tre i gesti:

  1. gestire un doppio tocco
  2. gestire un longPressGesture
  3. gestire un solo tocco

Testato su Xcode versione 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)
        }
}

1

Questo non è testato, ma puoi provare ad aggiungere un LongPressGestureal tuo pulsante.

Presumibilmente sembrerà qualcosa del genere.

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)
    }
}

Ciao Kilian In realtà avrei dovuto menzionare che avevo già provato ad aggiungere un gesto longPress ma continuerà a "eseguire" solo l'azione "clic normale" e non a premere a lungo. Modificherò il mio post per aggiungerlo (come tu sei la seconda persona a suggerirlo - il primo ha eliminato la sua risposta).
Gerard,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.