SwiftUI: İKİ musluk ve düğmeye uzun basın nasıl ele alınır?


11

SwiftUI'de bir düğmem var ve "dokunma düğmesi" (normal tıklama / dokunma) ve "uzun basma" için farklı bir işlem yapabilmek istiyorum.

SwiftUI'de bu mümkün mü?

İşte şimdi sahip olduğum düğmenin basit kodu (sadece "normal" dokunma / dokunma durumunu işler).

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

Zaten bir "longPress hareketi" eklemeye çalıştım ama yine de sadece "normal / kısa" tıklamayı "yürütüyor". Bu denedim kodu oldu:

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

Teşekkürler!

Gerard

Yanıtlar:


15

Birçok şeyi denedim ama sonunda böyle bir şey yaptım:

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

Hala efektleri olan bir düğme ama kısa ve uzun basma farklı.


3
Lütfen Xcode 11.2.1 / iOS 13.2'den itibaren siparişin burada önemli göründüğünü unutmayın. Kullanılması onLongPressGesture()önce onTapGesture()ikinci bir yok sayacaktır.
Koraktor

bu, koda dokunma veya basma ve engelleme animasyonuna sahip değilaction
Faruk

3

Az önce etkinin uygulamanın sırasına bağlı olduğunu keşfettim. Hareketlerin algılanmasını aşağıdaki sırayla uygulamak, üç hareketi de tespit etmek ve tanımlamak mümkün görünmektedir:

  1. çift ​​dokunma hareketini yönetme
  2. longPressGesture ile başa çıkmak
  3. tek bir dokunma hareketini yönetme

Xcode Sürüm 11.3.1 (11C504) üzerinde test edildi

    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

Bu test edilmedi, ancak bir LongPressGesture düğmenize .

Muhtemelen böyle bir şey olacak.

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

Merhaba Kilian Aslında zaten bir longPress hareketi eklemeyi denediğimden bahsetmeliydim, ancak yine de uzun basın değil, sadece "normal tıklama" eylemini "yürütecek". Bunu eklemek için yazımı düzenleyeceğim (bunu öneren 2. kişi sizsiniz - ilk kişi cevabını sildi).
Gerard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.