【问题标题】:SwiftUI on macOS - handle single-click and double-click at the same timemacOS 上的 SwiftUI - 同时处理单击和双击
【发布时间】:2020-01-30 18:11:47
【问题描述】:

考虑一下 SwiftUI 中的这个视图:

struct MyView: View {
    var body: some View {
        Rectangle()
            .fill(Color.blue)
            .frame(width: 200, height: 200)
            .onTapGesture {
                print("single clicked")
            }
    }
}

现在我们正在处理单击。假设你也想处理双击,但需要一个单独的回调。

你有两个选择:

  • 单击后添加双击处理程序 - 这根本不起作用
  • 在单击处理程序之前添加双击处理程序,这有点工作:
struct MyView: View {
    var body: some View {
        Rectangle()
            .fill(Color.blue)
            .frame(width: 200, height: 200)
            .onTapGesture(count: 2) {
                print("double clicked")
            }
            .onTapGesture {
                print("single clicked")
            }
    }
}

正确调用了双击处理程序,但在延迟约 250 毫秒后调用了单击处理程序。

有什么办法解决这个问题吗?

【问题讨论】:

标签: swift macos swiftui


【解决方案1】:

这是可能的方法(使用 Xcode 11.2 / macOS 10.15 测试)

struct MyView: View {
    var body: some View {
        Rectangle()
            .fill(Color.blue)
            .frame(width: 200, height: 200)
            .gesture(TapGesture(count: 2).onEnded {
                print("double clicked")
            })
            .simultaneousGesture(TapGesture().onEnded {
                print("single clicked")
            })
    }
}

【讨论】:

  • 嗯...双击矩形似乎会同时调用两者。
  • 在 macOS 11.2 (Big Sur) 上按预期工作。
  • 在 macCatalyst 下似乎不起作用
  • @ElTomato:注册右击手势可能有救命之道,这里:stackoverflow.com/a/66432412/14998134
  • 在 Big Sur 上工作,11.4