SwiftUI: làm thế nào để xử lý BÓNG tap & nhấn nút dài?


11

Tôi có một nút trong SwiftUI và tôi muốn có một hành động khác cho "nút nhấn" (nhấp / nhấn bình thường) và "nhấn lâu".

Điều đó có khả thi trong SwiftUI không?

Đây là mã đơn giản cho nút tôi có bây giờ (chỉ xử lý trường hợp chạm / chạm "bình thường").

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

Tôi đã cố gắng thêm "cử chỉ longPress" nhưng nó vẫn chỉ "thực thi" nhấp chuột "bình thường / ngắn". Đây là mã tôi đã thử:

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

Cảm ơn!

Gerard

Câu trả lời:


15

Tôi đã thử nhiều thứ nhưng cuối cùng tôi đã làm một cái gì đó như thế này:

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

Nó vẫn là một nút có hiệu ứng nhưng bấm ngắn và dài thì khác.


3
Xin lưu ý rằng kể từ Xcode 11.2.1 / iOS 13.2, thứ tự dường như rất quan trọng ở đây. Sử dụng onLongPressGesture()trước onTapGesture()sẽ bỏ qua cái sau.
Koraktor

điều này không có hình ảnh động của việc nhấn hoặc nhấn và chặn mã trongaction
Faruk

3

Tôi chỉ phát hiện ra rằng hiệu quả phụ thuộc vào thứ tự thực hiện. Việc thực hiện phát hiện cử chỉ theo thứ tự sau đây dường như có thể phát hiện và xác định cả ba cử chỉ:

  1. xử lý một cử chỉ chạm hai lần
  2. xử lý một longPressGesture
  3. xử lý một cử chỉ nhấn

Đã thử nghiệm trên Xcode Phiên bản 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

Điều này chưa được thử nghiệm, nhưng bạn có thể thử thêm một LongPressGesturenút vào nút của mình.

Nó có lẽ sẽ trông giống như thế này.

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

Xin chào Kilian Thật ra tôi nên đề cập rằng tôi đã thử thêm một cử chỉ longPress nhưng nó vẫn sẽ chỉ "thực thi" hành động "nhấp chuột bình thường" chứ không phải nhấn lâu. Sẽ chỉnh sửa bài đăng của tôi để thêm vào đó (vì bạn là người thứ 2 gợi ý rằng - người đầu tiên đã xóa câu trả lời của anh ấy).
Gerard
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.