¿Cómo "transferir" el primer respondedor de una UIView a otra?
-
07-07-2019 - |
Pregunta
Tengo una subclase de UIView ( CustomView
para los fines de esta pregunta) que tiene su propio manejo de todos los eventos de toques
(Comenzado, Movido, Finalizado, Cancelado). También tengo un UIButton
que es un hermano de CustomView
que se superpone.
Por ejemplo, mi jerarquía de vistas se ve así:
- UIView (vista del controlador)
- CustomView con marco (0, 0, 300, 300)
- UIButton con marco (0, 0, 100, 50)
Me gustaría que CustomView capture eventos táctiles una vez que el usuario haya salido del UIButton. A través del registro de depuración, parece que el evento UIControlEventTouchDragExit
es el que debe interceptar (aunque no se dispara hasta que el toque esté a unos 100 píxeles del botón, pero eso no es importante para esta pregunta) .
Idealmente, cuando se activa el evento de arrastrar y salir, el botón dejaría de recibir eventos de movimiento táctil, el CustomView obtendría un evento touchesBegan
(incluso si necesito falsificar uno yo mismo de alguna manera), y todo futuros eventos táctiles ( touchesMoved
, etc.) se enviarían a CustomView.
He intentado lo siguiente, y no tiene ningún efecto:
-(void)btnTouchDragExit:(id)sender
{
UIButton * btn = sender;
[btn resignFirstResponder];
[customView becomeFirstResponder];
}
Creo que el objeto UITouch
subyacente (que es coherente en todos los eventos táctiles) no se reorienta para apuntar a CustomView. ¿Cómo puedo lograr el efecto deseado?
Solución
Simplemente use hitTest: withEvent: para descubrir qué vista " debería " recibir el evento, luego reenviar el evento a la vista correspondiente. Es posible que deba bailar un poco para interceptar los eventos antes de que vayan al botón, pero esto es para lo que se hizo hitTest: withEvent:
Otros consejos
debe anular canBecomeFirstResponder
para devolver SÍ; de lo contrario, BecomeFirstResponder
no hace nada. Esto ya se hace en UIControl
s, pero no en UIView
s