SwiftUI: BOTH टैप एंड लॉन्ग प्रेस ऑफ़ बटन को कैसे हैंडल करें?


11

मेरे पास SwiftUI में एक बटन है और मैं "टैप बटन" (सामान्य क्लिक / टैप) और "लॉन्ग प्रेस" के लिए एक अलग कार्रवाई करने में सक्षम होना चाहूंगा।

क्या स्विफ्टयूआई में यह संभव है?

अब मेरे पास जो बटन है उसके लिए सरल कोड है (केवल "सामान्य" टैप / टच केस को हैंडल करता है)।

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

मैंने पहले ही "लॉन्गप्रेस इशारे" को जोड़ने की कोशिश की थी लेकिन यह अभी भी "सामान्य / संक्षिप्त" क्लिक को "निष्पादित" करता है। यह वह कोड था जिसे मैंने आज़माया था:

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

धन्यवाद!

जेरार्ड

जवाबों:


15

मैंने कई चीजों की कोशिश की लेकिन आखिरकार मैंने कुछ ऐसा किया:

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

यह अभी भी प्रभाव के साथ एक बटन है, लेकिन छोटे और लंबे प्रेस अलग हैं।


3
कृपया ध्यान दें कि Xcode 11.2.1 / iOS 13.2 के रूप में यह आदेश यहां महत्वपूर्ण लगता है। onLongPressGesture()पहले का उपयोग करना onTapGesture()बाद वाले को अनदेखा करेगा।
कोराकटोर

इसमें टैप करने या दबाने और कोड को रोकने का एनीमेशन नहीं हैaction
फ़रुक

3

मैंने अभी पता लगाया है कि प्रभाव कार्यान्वयन के आदेश पर निर्भर करता है। निम्नलिखित आदेशों में इशारों का पता लगाने को लागू करना तीनों इशारों का पता लगाना और पहचानना संभव बनाता है:

  1. एक डबल नल इशारा संभाल
  2. एक longPressGesture संभाल
  3. एक नल का इशारा संभाल

Xcode संस्करण 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

यह परीक्षण नहीं किया गया है, लेकिन आप LongPressGestureअपने बटन में एक जोड़ने की कोशिश कर सकते हैं ।

यह संभवतः कुछ इस तरह दिखेगा।

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

हाय किलियन वास्तव में मुझे यह उल्लेख करना चाहिए कि मैंने पहले ही एक लॉन्गप्रेस जेस्चर जोड़ने की कोशिश की थी, लेकिन यह अभी भी "सामान्य क्लिक" कार्रवाई को "निष्पादित" करेगा और लंबे प्रेस नहीं। जोड़ने के लिए मेरी पोस्ट को संपादित करेगा (जैसा कि आप सुझाव देने के लिए दूसरे व्यक्ति हैं - पहले वाले ने अपना उत्तर हटा दिया)।
गेरार्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.