SwiftUI: วิธีจัดการกับการแตะทั้งสอง & การกดปุ่มค้างนาน ๆ ?


11

ฉันมีปุ่มใน SwiftUI และฉันต้องการที่จะสามารถดำเนินการที่แตกต่างกันสำหรับ "ปุ่มแตะ" (คลิก / แตะปกติ) และ "กดแบบยาว"

เป็นไปได้ใน 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()จะไม่สนใจอันหลัง
Koraktor

สิ่งนี้ไม่มีภาพเคลื่อนไหวของการแตะหรือกดและการบล็อกโค้ดในaction
Faruk

3

ฉันเพิ่งค้นพบว่าผลกระทบนั้นขึ้นอยู่กับลำดับของการดำเนินการ การใช้การตรวจจับท่าทางตามลำดับต่อไปนี้ดูเหมือนว่าจะเป็นไปได้ในการตรวจจับและระบุท่าทางทั้งสาม:

  1. จัดการท่าทางแตะสองครั้ง
  2. จัดการกดแบบยาวท่าทาง
  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)
    }
}

สวัสดี Kilian จริง ๆ แล้วฉันควรจะกล่าวว่าฉันได้ลองเพิ่มท่าทางกดแบบยาวแล้ว แต่มันจะยังคง "ดำเนินการ" การกระทำ "คลิกปกติ" เท่านั้นและไม่ใช่กดแบบยาว จะแก้ไขโพสต์ของฉันเพื่อเพิ่ม (เช่นคุณเป็นคนที่ 2 เพื่อแนะนำว่า - คนแรกลบคำตอบของเขา)
เจอราร์ด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.