Quero usar um gesto de toque longo e detectar quando o usuário segura por 1 segundo consecutivo e também quero detectar quando o usuário solta a tela. Atualmente o onChanged detecta quando o gesto começa e o onEnded é acionado após 1 segundo. Portanto, posso usar o onEnded para detectar quando o usuário está segurando por 1 segundo consecutivo. Mas como posso saber quando o usuário libera?
Color.blue
.simultaneousGesture(LongPressGesture(minimumDuration: 1.0)
.onChanged { _ in
UIImpactFeedbackGenerator(style: .light).impactOccurred()
}
.onEnded { _ in
UIImpactFeedbackGenerator(style: .light).impactOccurred()
}
)
Como você descobriu,
LongPressGesture
termina quando o intervalo de tempo necessário para acioná-lo termina, e não quando o usuário levanta o dedo. Portanto, não é adequado para detectar o levantamento do dedo.Eu usaria um
DragGesture
em vez disso. ÉonChanged
chamado quando o gesto começa e éonEnded
chamado quando o dedo se levanta. Podemos registrar a hora de inícioonChanged
e a hora de términoonEnded
e, portanto, há quanto tempo o usuário está pressionando.Observe que eu mudei para usar
sensoryFeedback
para criar o feedback tátil. Se você deseja uma versão mais antiga que o iOS 17, usarUIImpactFeedbackGenerator
também é adequado.Observe que, diferentemente de um
LongPressGesture
, que não é acionado quando o usuário move muito o dedo após pressioná-lo,DragGesture
ainda é reconhecido se o dedo se mover. Se isso for indesejável, use avalue.translation
propriedade para determinar se o dedo se moveu demais.