J'écris une application simple Mines me aider à mieux connaître SwiftUI. En tant que tel, je veux que le clic principal (généralement LMB) "creuse" (révèle s'il y a une mine là-bas), et un clic secondaire (généralement RMB) pour placer un drapeau.
J'ai le travail de creusage! Mais je ne peux pas comprendre comment placer un indicateur, car je ne peux pas comprendre comment détecter un clic secondaire.
BoardSquareView(
style: self.style(for: square),
model: square
)
.gesture(TapGesture().modifiers(.control).onEnded(self.handleUserDidAltTap(square)))
.gesture(TapGesture().onEnded(self.handleUserDidTap(square)))
Comme je l'ai laissé entendre précédemment, la fonction renvoyée par handleUserDidTap
est appelée correctement lors d'un clic, mais celle renvoyée par handleUserDidAltTap
n'est appelée que lorsque je maintiens la touche Ctrl enfoncée. C'est logique parce que c'est ce que dit le code ... mais je ne vois aucune API qui pourrait lui permettre d'enregistrer des clics secondaires, donc je ne sais pas quoi faire d'autre.
J'ai également essayé cela, mais le comportement semblait identique:
BoardSquareView(
style: self.style(for: square),
model: square
)
.gesture(TapGesture().modifiers(.control).onEnded(self.handleUserDidAltTap(square)))
.onTapGesture(self.handleUserDidTap(square))
la source
.onTapGesture()
Vérifiez-le..gesture(TapGesture().onEnded(.......))
Réponses:
En l'état actuel des choses avec SwiftUI, ce n'est pas directement possible. Je suis sûr que ce sera dans le futur, mais pour le moment, il
TapGesture
est clairement axé principalement sur les cas d'utilisation iOS qui n'ont pas un concept de "clic droit", donc je pense que c'est pourquoi cela a été ignoré. Remarquez que le concept de «presse longue» est un citoyen de première classe sous la forme deLongPressGesture
, et qui est presque exclusivement utilisé dans un contexte iOS, qui soutient cette théorie.Cela dit, j'ai trouvé un moyen de faire fonctionner cela. Ce que vous devez faire, c'est vous replier sur l'ancienne technologie et l'intégrer dans votre vue SwiftUI.
J'ai testé cela, et cela a fonctionné pour moi dans une application SwiftUI assez complexe. L'approche de base ici est:
NSView
.NSViewRepresentable
.Ce n'est pas une solution idéale, mais cela pourrait être suffisant pour le moment. J'espère que cela résout votre problème jusqu'à ce qu'Apple élargisse les capacités de SwiftUI.
la source