私はSwiftUIを知るのに役立つ シンプルな鉱山アプリ を書いています。そのため、プライマリクリック(通常はLMB)で「掘る」(地雷があるかどうかを明らかにする)と、セカンダリクリック(通常はRMB)でフラグを設定します。
掘り出し作業中!しかし、フラグの配置方法がわかりません。セカンダリクリックを検出する方法がわからないためです。
BoardSquareView(
style: self.style(for: square),
model: square
)
.gesture(TapGesture().modifiers(.control).onEnded(self.handleUserDidAltTap(square)))
.gesture(TapGesture().onEnded(self.handleUserDidTap(square)))
前述のとおり、handleUserDidTap
によって返される関数はクリック時に正しく呼び出されますが、handleUserDidAltTap
によって返される関数は、Ctrlキーを押したときにのみ呼び出されます。それがコードが言っていることなので、それは理にかなっています...しかし、セカンダリクリックを登録する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の機能をさらに拡張するまで)で問題が解決することを願っています。