Tengo un montón de UIViews como en la imagen a continuación. La vista roja/rosa (semitransparente) está encima de las otras.¿Cómo encontrar confiablemente la vista correcta para UIGestureRecognizer?
- Rojo tiene
UISwipeGestureRecognizer
. - Verde tiene como
UITapGestureRecognizer
. - Azul no tiene reconocedor.
Un toque en la parte visible (inferior izquierda) de gatillo verde su reconocedor.
Un golpecito en las ocultos partes del verde no gatillo de su reconocedor (Rojas bloquea).
Ese es el problema: quiero que se dispare Green. ¿Cómo puedo hacer esto?
En la práctica, las vistas pueden estar en cualquier orden, cualquier número y ser subvistas de los demás, etc. Pero el problema es el mismo:
¿Cómo puedo encontrar de forma fiable la vista superior que puede manejar el gesto (toque o deslice)?
He intentado con el siguiente código. Atraviesa prolijamente todas las vistas, pero falla, ya que no puede saber si el evento es parte de un deslizamiento o un toque. Entonces el método siempre devuelve la vista roja. Si elimino el reconocedor de deslizamiento de Rojo, el código funciona correctamente.
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView *hitView = [super hitTest:point withEvent:event];
if (hitView == self)
{
if (self.hasASwipeRecognizer)
return self; // What if this was a tap?
if (self.hasATapRecognizer)
return self;
else
return nil;
}
else
return hitView;
}
Sí, la clave para esto es (como usted dice) para agregar todos los reconocedores a la supervista y manejarlo desde allí. Mi jerarquía es arbitrariamente compleja (creo que sopa de polígono) pero esta idea funciona. –