SwiftUI에서 마우스 오른쪽 버튼 클릭을 어떻게 감지합니까?


10

SwiftUI를 알 수 있도록 간단한 광산 앱 을 작성 중입니다. 따라서 1 차 클릭 (보통 LMB)은 "발굴"(지뢰가 있는지 여부를 표시)하고 2 차 클릭 (보통 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는 Control 키를 누른 상태에서만 호출됩니다. 그것은 코드가 말한 것이기 때문에 의미가 있습니다 ...하지만 보조 클릭을 등록 할 수있는 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() 확인 해봐.
Raymond

으악, 네가 맞아 @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의 기능을 더욱 확장 할 때까지 문제가 해결되기를 바랍니다.


감사합니다. 이것은 기본 적으로 내가 지금하고있는 일입니다 . 이것이 프레임 워크에 대한 첫 인상이라는 것이 정말 슬픈 일입니다. (🤞🏼 희망)까지 접수로 나는 더 나은 솔루션이 함께 제공이 표시됩니다
벤 Leggiero

1
웰프; 이것이 오늘 최고의 답변 인 것 같습니다. 현상금은 당신입니다! 언젠가 우리는 공식적인 해결책을 갖게 될 것입니다.
벤 레지에로
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.