sensibilidad - cómo eliminar todos los contactos de mi iphone
Cómo eliminar el reconocedor de gestos (10)
Declare un ivar
UITapGestureRecognizer *tap
en su @interface
.
Cambiar helpClicked
en:
- (void)helpClicked
{
CGRect visibleBounds = [self convertRect:[self bounds] toView:viewContainer];
CGFloat minimumVisibleX = CGRectGetMinX(visibleBounds);
UIImageView * helpOverlay = [[UIImageView alloc]initWithFrame:CGRectMake(minimumVisibleX, 0, 1024, 768)];
UIImage * helpImage = [UIImage imageNamed:@"HelpOverLay.png"];
[helpOverlay setImage:helpImage];
helpOverlay.tag = 50;
self.scrollEnabled = NO;
[self addSubview:helpOverlay];
tap = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissView)];
[self addGestureRecognizer:tap];
}
y dismissView
a:
for (UIGestureRecognizer *recognizer in self.view.gestureRecognizers) {
[self removeGestureRecognizer:tap];
}
EDITAR: creo que el método de nhahtdh es un poco más elegante en comparación con este.
EDIT2: parece que tienes [self addGestureRecognizer:tap]
funcionando, así que estoy asumiendo que esta es una subclase de UIView
.
SO, estoy agregando un reconocedor de gestos a una vista de superposición. Cuando se toca en la pantalla quiero que esta superposición desaparezca. Una vez dicho esto, al agregar un reconocedor de gestos se anula el "toque dentro" y otros eventos de clic de botón. Necesito esto de vuelta, por lo tanto, necesito eliminar el reconocimiento de detección. Puedo usar este método, sin embargo, tengo un problema. Mi código a continuación -
- (void)helpClicked
{
CGRect visibleBounds = [self convertRect:[self bounds] toView:viewContainer];
CGFloat minimumVisibleX = CGRectGetMinX(visibleBounds);
UIImageView * helpOverlay = [[UIImageView alloc]initWithFrame:CGRectMake(minimumVisibleX, 0, 1024, 768)];
UIImage * helpImage = [UIImage imageNamed:@"HelpOverLay.png"];
[helpOverlay setImage:helpImage];
helpOverlay.tag = 50;
self.scrollEnabled = NO;
[self addSubview:helpOverlay];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissView)];
[self addGestureRecognizer:tap];
}
Aquí estoy quitando la superposición de la otra vista.
- (void) dismissView
{
UIView *overlay = [self viewWithTag:50];
[overlay removeFromSuperview];
self.scrollEnabled = YES;
}
Mi pregunta es ¿cómo elimino el reconocedor de gestos en el segundo método? No puedo pasar el toque variable en este método ni tampoco puedo eliminarlo en el método anterior. ¿Alguna sugerencia? Me he visto atrapado con un montón de problemas variables pasables cuando se trata de eventos.
Desde WWDC 2015, Cocoa Touch Best Practices , se sugiere que guarde una propiedad o iVar si necesita acceder a ella más adelante, y no vaya con el uso de viewWithTag:
Moto: propiedades en lugar de etiquetas
Esto te salva de algunos problemas:
- Cuando se trata de múltiples gestos, elimina el gesto que desea directamente al acceder a la propiedad y eliminarlo. (Sin la necesidad de iterar todos los gestos de la vista para eliminar la correcta)
- Encontrar el gesto correcto de la etiqueta cuando está iterando es muy engañoso cuando tiene varias etiquetas en las vistas y cuando tiene conflictos con una etiqueta específica
(es decir) Lo implementó por primera vez con etiquetas, y todo funciona como se esperaba. Más tarde trabajas en otra funcionalidad que, por ejemplo, rompe esto y provoca un comportamiento no deseado que no esperas. El registro no le da una advertencia, y lo mejor que puede obtener depende del caso, se trata de un bloqueo que señaliza el selector no reconocido enviado a instancia . A veces no obtendrás ninguno de estos .
Solución
Declara el iVar
@implementation YourController {
UITapGestureRecognizer *tap;
}
Configura tu vista
- (void) helpClicked {
//Your customization code
//Adding tap gesture
tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissView)];
[self addGestureRecognizer:tap];
}
Eliminar el gesto directamente
- (void) dismissView {
[self.view removeGestureRecognizer:tap];
}
Es probable que su código se parezca más a esto, para el segundo método:
- (void) dismissView {
UIView *overlay = [self viewWithTag:50];
for (UIGestureRecognizer *recognizer in self.view.gestureRecognizers) {
if([recognizer isKindOfClass:[UITapGestureRecognizer class]]) {
[self removeGestureRecognizer:recognizer];
}
}
[overlay removeFromSuperview];
self.scrollEnabled = YES;
}
UITapGestureRecognizer
el cheque para UITapGestureRecognizer
, en caso de que su clase maneje más de 1 UIGestureRecognizer
y solo quiera eliminar eso.
Este ciclo eliminará todos los reconocedores de gestos que tenga una vista
for (UIGestureRecognizer *recognizer in self.view.gestureRecognizers) {
[self.view removeGestureRecognizer:recognizer];
}
Este trabajo para mí:
for (UIGestureRecognizer *gr in self.view.gestureRecognizers) {
[self.view removeGestureRecognizer:gr];
}
Funcionó para mí
while (view.gestureRecognizers.count) {
[view removeGestureRecognizer:[view.gestureRecognizers objectAtIndex:0]];
}
Si puede ampliar la vista, puede intentarlo de esta manera:
_ = gestureRecognizers.flatMap { $0.map { removeGestureRecognizer($0) } }
Simplemente configure la vista de superposición una vez, con el reconocedor de gestos configurado, pero haga que la vista de superposición quede oculta . Cuando una vista está oculta, no recibirá ningún toque del usuario. Solo haga que la vista de superposición vea la vista cuando sea necesario y que quede oculta cuando no la necesite.
Versión Swift :
for recognizer in yourView.gestureRecognizers! {
yourView.removeGestureRecognizer(recognizer)
}
En Swift 4
if let gestures = shotButton.gestureRecognizers //first be safe if gestures are there
{
for gesture in gestures //get one by one
{
shotButton.removeGestureRecognizer(gesture) //remove gesture one by one
}
}