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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top