SwiftUI iOS - 添加双击导致单击延迟后调用

fdv*_*zin 5 swift swiftui

我想识别下面的单击和双击Capsule。这段代码工作正常:

                         Capsule()
                                    .frame(width: 100, height: 42)
                                    .onTapGesture(count: 1) {
                                            print("Single Tap recognized instantly")
                                    }
Run Code Online (Sandbox Code Playgroud)

但是当我添加.onTapGesture(count: 2)到它时,单击会在 0.25 毫秒后调用。

                         Capsule()
                                    .frame(width: 100, height: 42)
                                    .onTapGesture(count: 2) {
                                            print("Double tap recognized instantly")
                                    }
                                    .onTapGesture(count: 1) {
                                            print("Single Tap recognized after 0.25ms")
                                    }
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

Sch*_*tky 1

只是为了澄清一件事:当您的目标是专门检测两者时,您不能将单次轻击手势与双击手势一起识别(即系统应该无延迟地区分单击和双击) )因为理论上单次点击总是会导致双击。这意味着您始终必须等待一段时间(在您的情况下为 0.25 毫秒)以排除用户想要双击的情况。

但是,当您的目标是将单次点击手势与双击手势结合在一起(即同时)时,现在这是完全可行的。

手势就像 SwiftUI 中的许多东西一样,protocol并且可以通过多种方式构建自定义手势,例如body视图。在您的情况下,我们需要双击手势与单击手势同时运行。最简单的方法是,声明一个具有不透明返回类型 ( some Gesture) 的计算属性,并在该属性中描述您的手势:

var tapGesture: some Gesture {
    TapGesture(count: 2)
        .onEnded {
            print("Double tap")
        }
        .simultaneously(with: TapGesture(count: 1)
                            .onEnded {
                                print("Single Tap")
                            })
}
Run Code Online (Sandbox Code Playgroud)

您可以简单地将此手势添加到您想要的任何视图中,就像您对任何其他手势执行相同的操作一样:

Capsule()
    .gesture(tapGesture)
Run Code Online (Sandbox Code Playgroud)