web-dev-qa-db-ja.com

SwiftUIで右クリックを検出するにはどうすればよいですか?

私は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))
10
Ben Leggiero

現在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. 他のSwiftUIビューで行うのと同じように、必要な場所に実装をUIに配置します。

理想的な解決策ではありませんが、今のところ十分かもしれません。 AppleがSwiftUIの機能をさらに拡張するまで)で問題が解決することを願っています。

4
B.T.