ios7 - sirven - Cómo deshabilitar el gesto hacia atrás en iOS 7 para una sola vista
para que sirven los gestos en el iphone (6)
Pruebe el siguiente código no probado en su FirstViewController:
-(void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}
-(void) viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
}
Estoy tratando de deshabilitar el gesto hacia atrás para mi controlador de vista usando el siguiente conjunto de código.
En FirstViewController.m
, configuro el delegado de interactivePopGestureRecognizer
- (void) viewWillLoad {
// Other stuff..
self.navigationController.interactivePopGestureRecognizer.delegate = self;
}
Y luego implementando el método <UIGestureRecognizerDelegate>
y devolviendo NO
.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
return NO;
}
Y en dealloc voy a configurar el delegado en cero. (He leído en alguna parte que en iOS 7, tienes que configurar manualmente los delegados a cero)
- (void)dealloc {
self.navigationController.delegate = nil;
self.navigationController.interactivePopGestureRecognizer.delegate = nil;
}
Esto funciona en FirstViewController
. Pero cuando SecondViewController
para esto, el gesto tampoco funciona en eso. ¿Cómo puedo desactivar el gesto en FirstViewController solamente?
También cuando hago estallar FirstViewController
para ir a RootViewController
y luego trato de presionar FirstViewController
nuevamente, obtengo el error de objeto desasignado:
[FirstViewController gestureRecognizer:shouldReceiveTouch:]: message sent to deallocated instance 0x14ed0280
¿Por qué más tengo que hacer otra cosa que configurar a los delegados a cero? ¿O lo estoy colocando en el lugar equivocado?
Para una sola vista, no sé cómo ... Pero utilizo el siguiente código para deshabilitar completamente el gesto de deslizar:
en su AppDelegate.m
if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}
Descubrí que configurar el gesto como desactivado solo no siempre funciona. Funciona, pero para mí solo sucedió después de que una vez usé la contraproducción. La segunda vez no desencadenaría la contracción. Además, como dijo John Rogers, es importante usar viewDidAppear y viewWillAppear ya que el navigationController else sería nulo.
La solución para mí era delegar el gesto e implementar el método shouldbegin para devolver NO:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// Disable iOS 7 back gesture
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
self.navigationController.interactivePopGestureRecognizer.delegate = self;
}
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
// Enable iOS 7 back gesture
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
self.navigationController.interactivePopGestureRecognizer.delegate = nil;
}
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
return NO;
}
Intenté todo lo anterior, pero no funcionaron para mí. Así que probé esto y me funciona tanto en IOS7 como en IOS8.
Solo asegúrese de que su controlador de vista implemente este protocolo, es decir, UIGestureRecognizerDelegate y escriba el código que se proporciona a continuación.
- (void) viewWillAppear: (BOOL) animado {
[super viewWillAppear : animated]; if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.enabled =
NO;
self.navigationController.interactivePopGestureRecognizer.delegate = self;
}}
- (BOOL) gestureRecognizerShouldBegin: (UIGestureRecognizer *) gestureRecognizer {
if ([gestureRecognizer isEqual:self.navigationController.interactivePopGestureRecognizer]) { return NO; } else { return YES; }
}
Originalmente coloqué estas respuestas en un comentario debajo de la respuesta aceptada, pero creo que esto debe decirse como una respuesta para obtener más visibilidad.
La mayoría de las veces, encontrará que la respuesta aceptada no funciona. Esto se debe a que viewWillAppear:
puede viewWillAppear:
antes de que la vista se agregue a la jerarquía de vistas de un controlador de navegación, por lo que self.navigationController
será nil
. Debido a esto, es posible que el PEPGestureRecognizer interactivo no se deshabilite en algunos casos. Es mejor llamarlo en viewDidAppear:
lugar.
Aquí hay un código que funcionará (suponiendo que su controlador de vista se haya agregado correctamente a la jerarquía de vista de un controlador de navegación):
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[[[self navigationController] interactivePopGestureRecognizer] setEnabled:NO];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[[self navigationController] interactivePopGestureRecognizer] setEnabled:YES];
}
Esto funcionó para mí en xCode 7:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
self.navigationController!.interactivePopGestureRecognizer!.enabled = false
}
override func viewWillDisappear(animated: Bool) {
super.viewDidDisappear(animated)
self.navigationController!.interactivePopGestureRecognizer!.enabled = true
}