iphone uiview-hierarchy touch-up-inside

iphone - TouchUpInside en UIView con niños



uiview-hierarchy touch-up-inside (5)

Esto funciona para mi

Swift 3

let gesture = UITapGestureRecognizer(target: self, action: selector(self.customViewClick)) withSender: self) customView.addGestureRecognizer(gesture) func customViewClick() { print("custom view clicked!") }

Puede que me esté perdiendo algo aquí, pero ...

Tengo un UIView con algunos niños (un par de UILabel ''s y UIImageView ). Necesito capturar un evento cuando el usuario hace clic (toca) en cualquier lugar dentro de la vista UIView principal: parte visible de la vista UIView o cualquiera de sus elementos UIView ).

¿Cuál es la mejor manera de hacer esto?


Puede cambiar la clase de UIView en el Inspector de Identidad ... UIControl en UIControl y luego puede agregar un evento para UITouchUpInside para su vista, para capturar los UITouchUpInside .

¡Buena suerte!

EDITAR: aquí hay un paso a paso con capturas de pantalla:

La vista...

... por supuesto, no hay eventos.

Regresa y cambia UIView con UIControl y ...

¡Ta-daa! ¡Eventos!

Conecta un método al evento UITouchUpInside

Así es como debería verse en el archivo de interfaz.

Así es como debería verse en el archivo de implementación (puede, por supuesto, reemplazar el registro con lo que quiera)


Puede fingir este comportamiento teniendo un reconocedor de gestos para la vista de sus padres y asegurándose de que sus hijos no tengan sus propios reconocedores de gestos. Para hacer esto, agregue un reconocedor de gestos a su UIView padre que escuche los UIView . Donde parentView es la vista que contiene sus vistas secundarias ( UILabels / UIImageView ) y handleTap es un método implementado por parentView , haga algo como:

UIGestureRecognizer *tapParent = [[UITapGestureRecognizer alloc]initWithTarget:parentView action:@selector(handleTap)]; [parentView addGestureRecognizer:tapParent]; [tapParent release];

Como las vistas de su hijo no tienen sus propios reconocedores de gestos, no "comen" el gesto, por lo que la vista de los padres responderá siempre que toque dentro de sus límites.


Tienes que dar un poco más de detalles porque hay múltiples opciones.

Si desea el toque normal, puede capturar uno de los eventos táctiles estándar y ver qué subvista obtuvo el evento. Algo como esto:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; if(touch.view != self.mySubViewOfInterest) { // perform my actions } }

Si necesita un reconocimiento de gestos complejos, puede usar uno de UIGestureRecognizer y asignarlo a las subvistas o la vista principal.

De todos modos, debe prestar atención a que todas las subvistas (las que desea que capten el evento) deben tener habilitada la interacción del usuario; de lo contrario, su vista principal capturará los eventos de las subvistas y terminará la depuración y depuración sin entender qué. está sucediendo.


Swift 4:

let clickGesture = UITapGestureRecognizer(target: self, action: #selector(self.onUiViewClick)) uiView.addGestureRecognizer(clickGesture) @objc func onUiViewClick(sender : UITapGestureRecognizer) { }