Estoy escribiendo una aplicación simple de Mines para ayudarme a conocer SwiftUI. Como tal, quiero que el clic primario (generalmente LMB) se "cave" (revele si hay una mina allí) y el clic secundario (generalmente RMB) para colocar una bandera.
Tengo la excavación trabajando! Pero no puedo entender cómo colocar una bandera, porque no puedo descubrir cómo detectar un clic secundario.
Esto es lo que estoy intentando :
BoardSquareView(
style: self.style(for: square),
model: square
)
.gesture(TapGesture().modifiers(.control).onEnded(self.handleUserDidAltTap(square)))
.gesture(TapGesture().onEnded(self.handleUserDidTap(square)))
Como implique anteriormente, la función devuelta por handleUserDidTap
se llama correctamente al hacer clic, pero la que devuelve handleUserDidAltTap
solo se llama cuando mantengo presionada la tecla Control. Eso tiene sentido porque eso es lo que dice el código ... pero no veo ninguna API que pueda hacer que registre clics secundarios, por lo que no sé qué más hacer.
También probé esto, pero el comportamiento parecía idéntico:
BoardSquareView(
style: self.style(for: square),
model: square
)
.gesture(TapGesture().modifiers(.control).onEnded(self.handleUserDidAltTap(square)))
.onTapGesture(self.handleUserDidTap(square))
fuente
.onTapGesture()
Echale un vistazo..gesture(TapGesture().onEnded(.......))
Respuestas:
Tal como están las cosas con SwiftUI en este momento, esto no es directamente posible. Estoy seguro de que lo será en el futuro, pero en este momento,
TapGesture
está claramente enfocado principalmente en los casos de uso de iOS que no tienen el concepto de "clic derecho", así que creo que es por eso que se ignoró. Tenga en cuenta que el concepto de "prensa larga" es un ciudadano de primera clase en la forma deLongPressGesture
, y que se utiliza casi exclusivamente en un contexto de iOS, que respalda esta teoría.Dicho esto, descubrí una manera de hacer que esto funcione. Lo que tiene que hacer es recurrir a la tecnología más antigua e integrarla en su vista SwiftUI.
Probé esto, y funcionó para mí dentro de una aplicación SwiftUI bastante compleja. El enfoque básico aquí es:
NSView
.NSViewRepresentable
.No es una solución ideal, pero podría ser lo suficientemente buena por ahora. Espero que esto resuelva su problema hasta que Apple expanda aún más las capacidades de SwiftUI.
fuente