SwiftUI: bagaimana menangani KEDUA ketukan & tekan lama tombol?


11

Saya memiliki tombol di SwiftUI dan saya ingin dapat memiliki tindakan berbeda untuk "tombol ketuk" (klik / ketuk normal) dan "tekan lama".

Apakah itu mungkin di SwiftUI?

Berikut adalah kode sederhana untuk tombol yang saya miliki sekarang (hanya menangani case sentuh / sentuh "normal").

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

Saya sudah mencoba menambahkan "longPress gesture" tetapi masih "mengeksekusi" klik "normal / pendek". Ini adalah kode yang saya coba:

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

Terima kasih!

Gerard

Jawaban:


15

Saya mencoba banyak hal tetapi akhirnya saya melakukan sesuatu seperti ini:

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

Itu masih tombol dengan efek tetapi pers pendek dan panjang berbeda.


3
Harap dicatat bahwa pada Xcode 11.2.1 / iOS 13.2 pesanan tampaknya penting di sini. Menggunakan onLongPressGesture()sebelumnya onTapGesture()akan mengabaikan yang terakhir.
Koraktor

ini tidak memiliki animasi mengetuk atau menekan dan memblokir kode diaction
Faruk

3

Saya baru menemukan bahwa efeknya tergantung pada urutan pelaksanaannya. Menerapkan deteksi gerakan dalam urutan berikut ini tampaknya mungkin untuk mendeteksi dan mengidentifikasi ketiga gerakan:

  1. menangani gerakan ketuk ganda
  2. menangani GerakanTekan panjang
  3. menangani satu gerakan ketukan

Diuji pada Xcode Versi 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

Ini tidak diuji, tetapi Anda dapat mencoba menambahkan LongPressGestureke tombol Anda.

Agaknya akan terlihat seperti ini.

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

Hai Kilian Sebenarnya saya seharusnya menyebutkan bahwa saya sudah mencoba menambahkan gerakan longPress tetapi masih akan hanya "mengeksekusi" tindakan "klik normal" dan bukan tekan lama. Akan mengedit posting saya untuk menambahkan itu (karena Anda adalah orang kedua yang menyarankan itu - yang pertama menghapus jawabannya).
Gerard
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.