Estou escrevendo um aplicativo simples do Mines para me ajudar a conhecer o SwiftUI. Como tal, quero que o clique primário (normalmente LMB) "cave" (revele se há um mina lá) e o clique secundário (geralmente RMB) para colocar um sinalizador.
Eu tenho a escavação trabalhando! Mas não consigo descobrir como colocar uma bandeira, porque não consigo descobrir como detectar um clique secundário.
Aqui está o que estou tentando :
BoardSquareView(
style: self.style(for: square),
model: square
)
.gesture(TapGesture().modifiers(.control).onEnded(self.handleUserDidAltTap(square)))
.gesture(TapGesture().onEnded(self.handleUserDidTap(square)))
Como sugeri anteriormente, a função retornada por handleUserDidTap
é chamada corretamente ao clicar, mas a retornada por handleUserDidAltTap
é chamada somente quando eu pressiono a tecla Control. Isso faz sentido, porque é isso que o código diz ... mas não vejo nenhuma API que possa fazer com que ele registre cliques secundários, então não sei mais o que fazer.
Eu também tentei isso, mas o comportamento parecia idêntico:
BoardSquareView(
style: self.style(for: square),
model: square
)
.gesture(TapGesture().modifiers(.control).onEnded(self.handleUserDidAltTap(square)))
.onTapGesture(self.handleUserDidTap(square))
fonte
.onTapGesture()
Confira..gesture(TapGesture().onEnded(.......))
Respostas:
Como as coisas estão no SwiftUI agora, isso não é diretamente possível. Tenho certeza de que será no futuro, mas, no momento, ele
TapGesture
está claramente focado principalmente nos casos de uso do iOS que não têm o conceito de "clique direito", então acho que é por isso que isso foi ignorado. Observe que o conceito de "pressão longa" é um cidadão de primeira classe na forma deLongPressGesture
, e que é usado quase exclusivamente em um contexto iOS, que suporta essa teoria.Dito isto, eu descobri uma maneira de fazer isso funcionar. O que você precisa fazer é recorrer à tecnologia mais antiga e incorporá-la à sua visualização SwiftUI.
Eu testei isso e funcionou para mim em um aplicativo SwiftUI bastante complexo. A abordagem básica aqui é:
NSView
.NSViewRepresentable
.Não é uma solução ideal, mas pode ser boa o suficiente por enquanto. Espero que isso resolva seu problema até que a Apple expanda ainda mais os recursos do SwiftUI.
fonte