Ich schreibe eine einfache Mines-App , um SwiftUI kennenzulernen. Als solches möchte ich, dass der primäre Klick (normalerweise LMB) "gräbt" (zeigt an, ob sich dort eine Mine befindet) und der sekundäre Klick (normalerweise RMB), um eine Flagge zu platzieren.
Ich habe das Graben arbeiten! Aber ich kann nicht herausfinden, wie man eine Flagge platziert, weil ich nicht herausfinden kann, wie man einen sekundären Klick erkennt.
BoardSquareView(
style: self.style(for: square),
model: square
)
.gesture(TapGesture().modifiers(.control).onEnded(self.handleUserDidAltTap(square)))
.gesture(TapGesture().onEnded(self.handleUserDidTap(square)))
Wie ich bereits angedeutet habe, wird die von zurückgegebene Funktion handleUserDidTap
beim Klicken ordnungsgemäß aufgerufen , die von zurückgegebene Funktion handleUserDidAltTap
wird jedoch nur aufgerufen, wenn ich die Steuertaste gedrückt halte. Das ist sinnvoll, weil der Code dies sagt ... aber ich sehe keine API, die dazu führen könnte, dass sekundäre Klicks registriert werden, sodass ich nicht weiß, was ich sonst tun soll.
Ich habe es auch versucht, aber das Verhalten schien identisch zu sein:
BoardSquareView(
style: self.style(for: square),
model: square
)
.gesture(TapGesture().modifiers(.control).onEnded(self.handleUserDidAltTap(square)))
.onTapGesture(self.handleUserDidTap(square))
quelle
.onTapGesture()
Hör zu..gesture(TapGesture().onEnded(.......))
Antworten:
Nach dem derzeitigen Stand von SwiftUI ist dies nicht direkt möglich. Ich bin mir sicher, dass dies in Zukunft der Fall sein wird, aber im Moment
TapGesture
konzentriert sich das eindeutig hauptsächlich auf die iOS-Anwendungsfälle, bei denen kein "Rechtsklick" vorliegt. Ich denke, dies wurde deshalb ignoriert. Beachten Sie, dass das Konzept der "langen Presse" ein erstklassiger Bürger in Form vonLongPressGesture
ist und fast ausschließlich in einem iOS-Kontext verwendet wird, der diese Theorie unterstützt.Trotzdem habe ich einen Weg gefunden, um diese Arbeit zu machen. Sie müssen lediglich auf die ältere Technologie zurückgreifen und diese in Ihre SwiftUI-Ansicht einbetten.
Ich habe dies getestet und es hat bei mir in einer ziemlich komplexen SwiftUI-Anwendung funktioniert. Der grundlegende Ansatz hier ist:
NSView
.NSViewRepresentable
.Keine ideale Lösung, aber für den Moment vielleicht gut genug. Ich hoffe, dies löst Ihr Problem, bis Apple die Funktionen von SwiftUI weiter erweitert.
quelle