SwiftUI:如何处理点击和长按按钮?


11

我在SwiftUI中有一个按钮,我希望能够对“轻击按钮”(正常单击/轻击)和“长按”采取不同的操作。

在SwiftUI中有可能吗?

这是我现在拥有的按钮的简单代码(仅处理“常规”轻触/触摸盒)。

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

我已经尝试添加“ longPress手势”,但是它仍然只能“执行”“正常/短”点击。这是我尝试的代码:

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

谢谢!

杰拉德

Answers:


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()before onTapGesture()将忽略后一个。
Koraktor

这不具有点击或按下和阻止代码的动画效果action
Faruk

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

这未经测试,但是您可以尝试将a添加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实际上,我应该提到我已经尝试过添加longPress手势,但是它仍然只会“执行”“正常点击”操作,而不是“长按”。将编辑我的帖子以添加该内容(因为您是第二个建议的人-第一个删除了他的答案)。
杰勒德(Gerard)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.