ios uinavigationcontroller ios7 gesture

ios - ¿El gesto interactivo de UINavigationController no funciona?



ios7 gesture (7)

Descubrí que al usar botones de retroceso personalizados, el gesto pop interactivo deja de funcionar (mi opinión es que Apple no puede prever cómo se comportará su botón de retroceso personalizado, por lo que deshabilitan el gesto).

Para solucionar este problema, como se mencionó anteriormente, puede establecer la propiedad interactivePopGestureRecognizer.delegate en nil .

En Swift, esto se puede hacer fácilmente en toda su aplicación agregando una extensión para UINavigationController como esta :

extension UINavigationController { override public func viewDidLoad() { super.viewDidLoad() interactivePopGestureRecognizer?.delegate = nil } }

Respuesta actualizada

Parece que configurar el delegado en nil hace que la interfaz de usuario de la aplicación se congele en algunos escenarios (por ejemplo, cuando el usuario desliza el dedo hacia la izquierda o hacia la derecha en el controlador de vista superior de la pila de navegación).

Debido a que el método delegado de UINavigationController no puede manejarse en una extensión, la subclase de UINavigationController parece la mejor solución:

class NavigationController: UINavigationController, UIGestureRecognizerDelegate { /// Custom back buttons disable the interactive pop animation /// To enable it back we set the recognizer to `self` override func viewDidLoad() { super.viewDidLoad() interactivePopGestureRecognizer?.delegate = self } func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool { return viewControllers.count > 1 } }

Así que tengo un controlador de navegación en mi aplicación construida para iOS 7. La vista de título es visible, así como el botón Atrás y la barra de navegación en sí. Por alguna razón, el gesto de pop interactivo (deslizar desde el borde izquierdo) no funciona. No pasa nada. Cuando registro el gesto, no es nulo. ¿Hay algo especial que deba hacer para habilitar esta funcionalidad? ¿Qué podría hacer que no funcione?


Eh, parece que solo tuve que configurar el gesto delegado e implementar lo siguiente:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; }


En Swift 4, tengo un UITableView dentro de mi controlador de vista, resolví este problema con:

override func viewDidLoad() { super.viewDidLoad() self.navigationController?.interactivePopGestureRecognizer?.delegate=nil }


La respuesta más elaborada fue tanto Aaron como lojals.

Primero, personalice el controlador de navegación y luego coloque este código en la clase

En ViewDidload pon esta línea:

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;

Y en clase escribe esta función.

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES;}


Mira esta response y comentarios. Todo lo que tiene que hacer es configurar el delegado del reconocedor de gestos pop interactivos de su controlador de navegación en nil :

self.navigationController.interactivePopGestureRecognizer.delegate = nil;

Establecerlo en un self fundido en id<UIGestureRecognizerDelegate> también funciona porque todos los métodos en el protocolo son opcionales, pero creo que configurar el delegado a nil es más apropiado en este caso.


Puedes poner esta línea en el método viewDidLoad .

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;


Tal vez alguien pueda encontrar esto útil.

Si desea ocultar la barra de navegación pero usa gestos de deslizamiento normales para regresar y otras funciones del controlador de navegación, debe usar: (barra de navegación )

self.navigationController?.navigationBar.isHidden = true

Si desea deshabilitar la barra de navegación (ocultar la barra de navegación, deshabilite el deslizamiento hacia atrás) pero quiere presionar el controlador de vista que debe usar: ( isNavigationBarHidden )

self.navigationController?.isNavigationBarHidden = true

Actualización 7-DEC-2018:

En caso de que su primer controlador use la barra de navegación oculta, pero los siguientes niños usen la barra de navegación, cuando regrese al controlador de vista base verá una barra negra en transición en lugar de la barra de navegación. Esto se solucionará muy fácilmente si lo usas en el primer controlador de vista (padre):

override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.navigationController?.setNavigationBarHidden(true, animated: animated) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) self.navigationController?.setNavigationBarHidden(false, animated: animated) }