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))
답변
현재 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
. - 구현하는 SwiftUI 뷰로 감싸십시오
NSViewRepresentable
. - 다른 SwiftUI보기와 마찬가지로 구현을 원하는 위치로 UI에 적용하십시오.
이상적인 솔루션은 아니지만 지금은 충분할 것입니다. Apple이 SwiftUI의 기능을 더욱 확장 할 때까지 문제가 해결되기를 바랍니다.