我正在写a simple Mines app以帮助我了解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
返回的功能,但是只有当我按住Control键时才调用handleUserDidAltTap
返回的功能。这是有道理的,因为这就是代码所说的...但是我看不到任何可以使它注册第二次点击的API,所以我不知道该怎么办。
我也尝试过这个,但是行为似乎是相同的:
BoardSquareView(
style: self.style(for: square),
model: square
)
.gesture(TapGesture().modifiers(.control).onEnded(self.handleUserDidAltTap(square)))
.onTapGesture(self.handleUserDidTap(square))
正如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应用程序中为我工作。这里的基本方法是:
NSView
。NSViewRepresentable
的SwiftUI视图包装。这不是理想的解决方案,但目前可能已经足够。我希望这能解决您的问题,直到Apple进一步扩展SwiftUI的功能为止。