如何在SwiftUI中检测右键单击?

问题描述 投票:2回答:1

我正在写a simple Mines app以帮助我了解SwiftUI。因此,我希望主要点击(通常是LMB)“挖”(揭示那里是否有矿山),而又希望次要点击(通常是人民币)来标记。

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

Here's what I'm trying

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

[正如我之前暗示的那样,单击时可以正确调用handleUserDidTap返回的功能,但是只有当我按住Control键时才调用handleUserDidAltTap返回的功能。这是有道理的,因为这就是代码所说的...但是我看不到任何可以使它注册第二次点击的API,所以我不知道该怎么办。

我也尝试过这个,但是行为似乎是相同的:

BoardSquareView(
    style: self.style(for: square),
    model: square
)
.gesture(TapGesture().modifiers(.control).onEnded(self.handleUserDidAltTap(square)))
.onTapGesture(self.handleUserDidTap(square))
swift event-handling mouseevent swiftui right-click
1个回答
0
投票

正如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. 用实现NSViewRepresentable的SwiftUI视图包装。
  3. 将实现放入所需的UI中,就像处理其他任何SwiftUI视图一样。

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

© www.soinside.com 2019 - 2024. All rights reserved.