volver preferslargetitles prefer para large gestos como bar atras ios objective-c uinavigationcontroller uigesturerecognizer ios7

ios - para - preferslargetitles



Cómo deshabilitar el gesto de retroceso en UINavigationController en iOS 7 (15)

EDITAR

Si desea administrar la función de deslizar hacia atrás para controladores de navegación específicos, considere usar SwipeBack .

Con esto, puede establecer navigationController.swipeBackEnabled = NO .

Por ejemplo:

#import <SwipeBack/SwipeBack.h> - (void)viewWillAppear:(BOOL)animated { navigationController.swipeBackEnabled = NO; }

Se puede instalar a través de CocoaPods .

pod ''SwipeBack'', ''~> 1.0''

Me disculpo por la falta de explicación.

En iOS 7 Apple agregó un nuevo comportamiento de navegación predeterminado. Puede deslizar desde el borde izquierdo de la pantalla para volver a la pila de navegación. Pero en mi aplicación, este comportamiento entra en conflicto con mi menú izquierdo personalizado. Entonces, ¿es posible deshabilitar este nuevo gesto en UINavigationController?


A partir de iOS 8 la respuesta aceptada ya no funciona. Necesitaba detener el gesto de deslizar para descartar en mi pantalla principal del juego, así que implementé esto:

- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.delegate = self; } } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.delegate = nil; } } - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { return NO; }


Descubrí que configurar el gesto como deshabilitado no siempre funciona. Funciona, pero para mí solo lo hizo después de que una vez usé la curvatura hacia atrás. La segunda vez no provocaría la espalda.

La solución para mí fue 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; }


Encontré una solución:

C objetivo:

if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.enabled = NO; }

Swift 3:
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false


Este es el camino en Swift 3

funciona para mi

self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false


Esto funciona en viewDidLoad: para iOS 8:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ self.navigationController.interactivePopGestureRecognizer.enabled = false; });

Muchos de los problemas podrían resolverse con la ayuda del buen dispatch_after .

Aunque tenga en cuenta que esta solución es potencialmente insegura, utilice su propio razonamiento.

Actualizar

Para iOS 8.1 el tiempo de retardo debe ser de 0.5 segundos.

En iOS 9.3 ya no se necesita demora, funciona simplemente colocando esto en su viewDidLoad :
(TBD si funciona en iOS 9.0-9.3)

navigationController?.interactivePopGestureRecognizer?.enabled = false


He refinado un poco la respuesta de Twan, porque:

  1. Su controlador de vista puede configurarse como un delegado a otros reconocedores de gestos.
  2. configurar el delegado en nil conduce a problemas pendientes cuando regresa al controlador de vista raíz y realiza un gesto de deslizamiento antes de navegar a otro lado.

El siguiente ejemplo asume iOS 7:

{ id savedGestureRecognizerDelegate; } - (void)viewWillAppear:(BOOL)animated { savedGestureRecognizerDelegate = self.navigationController.interactivePopGestureRecognizer.delegate; self.navigationController.interactivePopGestureRecognizer.delegate = self; } - (void)viewWillDisappear:(BOOL)animated { self.navigationController.interactivePopGestureRecognizer.delegate = savedGestureRecognizerDelegate; } - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { if (gestureRecognizer == self.navigationController.interactivePopGestureRecognizer) { return NO; } // add whatever logic you would otherwise have return YES; }


Mi metodo Un reconocedor de gestos para gobernarlos a todos:

class DisabledGestureViewController: UIViewController: UIGestureRecognizerDelegate { override func viewDidLoad() { super.viewDidLoad() navigationController!.interactivePopGestureRecognizer!.delegate = self } func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool { // Prevent going back to the previous view return !(navigationController!.topViewController is DisabledGestureViewController) } }

Importante: no reinicie el delegado en ningún lugar de la pila de navigationController!.interactivePopGestureRecognizer!.delegate = nil : navigationController!.interactivePopGestureRecognizer!.delegate = nil


Ninguna de las respuestas dadas me ayudó a resolver el problema. Publicar mi respuesta aquí; puede ser útil para alguien

Declarar private var popGesture: UIGestureRecognizer? Como variable global en tu controlador de vista. Luego implemente el código en los métodos viewDidAppear y viewWillDisappear

override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) if self.navigationController!.respondsToSelector(Selector("interactivePopGestureRecognizer")) { self.popGesture = navigationController!.interactivePopGestureRecognizer self.navigationController!.view.removeGestureRecognizer(navigationController!.interactivePopGestureRecognizer!) } } override func viewWillDisappear(animated: Bool) { super.viewWillDisappear(animated) if self.popGesture != nil { navigationController!.view.addGestureRecognizer(self.popGesture!) } }

Esto deshabilitará el desplazamiento hacia atrás en iOS v8.x en adelante


Para Swift 4 esto funciona:

class MyViewController: UIViewController, UIGestureRecognizerDelegate { override func viewDidLoad() { super.viewDidLoad() self.navigationController!.interactivePopGestureRecognizer!.gesture.delegate = self } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(true) self.navigationController!.interactivePopGestureRecognizer!.gesture.isEnabled = true } }


Para Swift:

navigationController!.interactivePopGestureRecognizer!.enabled = false


Por favor, establezca esto en la raíz vc:

-(void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:YES]; self.navigationController.interactivePopGestureRecognizer.enabled = NO; } -(void)viewDidDisappear:(BOOL)animated{ [super viewDidDisappear:YES]; self.navigationController.interactivePopGestureRecognizer.enabled = YES; }


Simplemente quite el reconocedor de gestos de NavigationController. Trabajar en iOS 8.

if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) [self.navigationController.view removeGestureRecognizer:self.navigationController.interactivePopGestureRecognizer];


Todas estas soluciones manipulan el reconocedor de gestos de Apple de una manera que no recomiendan. Un amigo me acaba de decir que hay una mejor solución:

[navigationController.interactivePopGestureRecognizer requireGestureRecognizerToFail: myPanGestureRecognizer];

donde myPanGestureRecognizer es el reconocedor de gestos que está utilizando, por ejemplo, para mostrar su menú. De esa manera, el reconocedor de gestos de Apple no se vuelve a activar cuando presiona un nuevo controlador de navegación y no necesita depender de demoras que pueden dispararse demasiado pronto si su teléfono se pone en suspensión o tiene una carga pesada.

Dejando esto aquí porque sé que no lo recordaré la próxima vez que lo necesite, y luego tendré la solución al problema aquí.


funciona para mí en ios 10 y más tarde:

- (void)viewWillAppear:(BOOL)animated { if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.enabled = NO; } }

no funciona en el método viewDidLoad ().