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


10

私は SwiftUIを知るのに役立つ簡単なMinesアプリを作成しています。そのため、プライマリクリック(通常は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))

1
最初のリンクが壊れています。プライベートレポ?
Gil Birman

.onTapGesture() 見てみな。
レイモンド、

おっと、あなたは正しい@GilBirman!修繕; 申し訳ありません
Ben Leggiero

@Raymond私は最初にそれを試しました。私は何か大きなものを見逃していない限り、それは同じように動作するようです.gesture(TapGesture().onEnded(.......))
Ben Leggiero

回答:


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.