¿Hay alguna condición de prioridad entre los métodos de gesto (gesto de sartén y gesto de deslizamiento)?
Pregunta
Estoy desarrollando una aplicación donde he usado el gesto de la sartén y el gesto de deslizamiento. Entonces, cada vez que hago el gesto de deslizamiento, pero el método del gesto de la sartén siempre se llama y no se llama el método de gesto de deslizamiento.
¿Hay alguna prioridad entre todo el método de gesto?
Solución
Puede llamarlos en paralelo implementando el siguiente método del UIGestureRecognizerDelegate
protocolo:
- (BOOL)gestureRecognizer:(UIPanGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UISwipeGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
Otros consejos
Hay una propiedad en el UIGestureRecognizer
clase llamada "CancelstouchesInview" que vale la pena a YES
. Esto hará que se cancelen los gestos pendientes. El gesto de la sartén se reconoce primero, ya que no necesita tener un evento de "retoque", por lo que cancela el gesto de deslizamiento.
Si desea que sean reconocidos ambos gestos, intente agregar:
[yourPanGestureInstance setCancelsTouchesInView:NO];
Dar prioridad para deslizar
Puedes dar prioridad a un UIGestureRecognizer
con el require(toFail:)
método.
@IBOutlet var myPanGestureRecognizer: UIPanGestureRecognizer!
@IBOutlet var mySwipeGestureRecognizer: UISwipeGestureRecognizer!
myPanGesture.require(toFail: mySwipeGestureRecognizer)
Ahora tu sartén solo se ejecutará si su golpe fuerte falla.
Usar sartén para todo
Si el golpe fuerte y sartén Los reconocedores de gestos no juegan bien con esta configuración, puedes llevar toda tu lógica en el sartén Reconocador de gestos para más control.
let minHeight: CGFloat = 100
let maxHeight: CGFloat = 700
let swipeVelocity: CGFloat = 500
var previousTranslationY: CGFloat = 0
@IBOutlet weak var cardHeightConstraint: NSLayoutConstraint!
@IBAction func didPanOnCard(_ sender: Any) {
guard let panGesture = sender as? UIPanGestureRecognizer else { return }
let gestureEnded = bool(panGesture.state == UIGestureRecognizerState.ended)
let velocity = panGesture.velocity(in: self.view)
if gestureEnded && abs(velocity.y) > swipeVelocity {
handlePanOnCardAsSwipe(withVelocity: velocity.y)
} else {
handlePanOnCard(panGesture)
}
}
func handlePanOnCard(_ panGesture: UIPanGestureRecognizer) {
let translation = panGesture.translation(in: self.view)
let translationYDelta = translation.y - previousTranslationY
if abs(translationYDelta) < 1 { return } // ignore small changes
let newCardHeight = cardHeightConstraint.constant - translationYDelta
if newCardHeight > minHeight && newCardHeight < maxHeight {
cardHeightConstraint.constant = newCardHeight
previousTranslationY = translation.y
}
if panGesture.state == UIGestureRecognizerState.ended {
previousTranslationY = 0
}
}
func handlePanOnCardAsSwipe(withVelocity velocity: CGFloat) {
if velocity.y > 0 {
dismissCard() // implementation not shown
} else {
maximizeCard() // implementation not shown
}
}
Aquí hay una demostración del código anterior en acción.