如何在SwiftUI中检测右键?


10

我正在编写一个简单的Mines应用程序,以帮助我了解SwiftUI。因此,我希望主要点击(通常是LMB)“挖”(揭示那里是否有矿井),以及希望次要点击(通常是人民币)来标记。

我正在挖掘工作!但是我不知道如何放置标记,因为我不知道如何检测辅助点击。

这是我正在尝试的

BoardSquareView(
    style: self.style(for: square),
    model: square
)
.gesture(TapGesture().modifiers(.control).onEnded(self.handleUserDidAltTap(square)))
.gesture(TapGesture().onEnded(self.handleUserDidTap(square)))

正如我前面所暗示的,handleUserDidTap单击时可以正确调用by返回的函数,但是handleUserDidAltTap只有在按住Control键时才能调用by 返回的函数。这是有道理的,因为这就是代码的意思……但是我看不到任何可以让其注册第二次点击的API,因此我不知道该怎么办。

我也尝试过此方法,但行为似乎相同:

BoardSquareView(
    style: self.style(for: square),
    model: square
)
.gesture(TapGesture().modifiers(.control).onEnded(self.handleUserDidAltTap(square)))
.onTapGesture(self.handleUserDidTap(square))

1
您的第一个链接已损坏。私人回购?
吉尔·伯曼

.onTapGesture() 一探究竟。
雷蒙德

哎呀,你说得对@GilBirman!固定; 对此感到抱歉
Ben Leggiero

@Raymond我先尝试了。除非我错过了一件大事,否则它的表现似乎与.gesture(TapGesture().onEnded(.......))
Ben Leggiero

Answers:


4

就SwiftUI而言,这是不可能的。我确定会在将来,但是目前,TapGesture它显然主要集中在没有“右键单击”概念的iOS用例上,因此我认为这就是为什么忽略了这一点。请注意,“长按”概念是形式的一等公民LongPressGesture,并且几乎只在支持这种理论的iOS上下文中使用。

也就是说,我确实想出了一种方法来完成这项工作。您所要做的就是依靠旧技术,然后将其嵌入到SwiftUI视图中。

struct RightClickableSwiftUIView: NSViewRepresentable {
    func updateNSView(_ nsView: RightClickableView, context: NSViewRepresentableContext<RightClickableSwiftUIView>) {
        print("Update")
    }

    func makeNSView(context: Context) -> RightClickableView {
        RightClickableView()
    }

}

class RightClickableView : NSView {
    override func mouseDown(with theEvent: NSEvent) {
        print("left mouse")
    }

    override func rightMouseDown(with theEvent: NSEvent) {
        print("right mouse")
    }
}

我对此进行了测试,并在相当复杂的SwiftUI应用程序中为我工作。这里的基本方法是:

  1. 将您的侦听组件创建为NSView
  2. 将其与实现的SwiftUI视图包装在一起NSViewRepresentable
  3. 就像将任何其他SwiftUI视图一样,将实现放入所需的UI中。

这不是一个理想的解决方案,但对于目前而言可能已经足够了。我希望这能解决您的问题,直到Apple进一步扩展SwiftUI的功能为止。


谢谢。这基本上就是我现在所做的。真的很遗憾,这是他们对框架的第一印象。我将其标记为接受,直到(希望🤞🏼)出现更好的解决方案为止
Ben Leggiero

1
韦尔 看起来这是今天最好的答案。赏金是你的!希望有一天我们将有一个正式的解决方案。
Ben Leggiero
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.