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?
326
navigationItem.hidesBackButton = true
, este gesto también se desactiva. En mi caso, implementé un botón de retroceso personalizado y lo agregué comoleftBarButtonItem
Respuestas:
Encontré una solución:
C objetivo:
Swift 3+:
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
fuente
enable / disable
reconocer enviewDidAppear:
/viewDidDisappear
. O bien, puede implementar elUIGestureRecognizerDelegate
protocolo con su lógica más compleja y establecerlo comorecognizer.delegate
propiedad.self.navigationController.interactivePopGestureRecognizer.enabled
la propiedad no funciona en los siguientes métodos de vista:viewDidLoad
,viewWillAppear
,viewDidAppear
,viewDidDisappear
, pero las obras en el métodoviewWillDisappear
. En iOS7 funciona en todos los métodos mencionados anteriormente. Así que trate de usarlo en cualquier otro método mientras trabaja en viewController, confirmo que funciona para mí en iOS8 cuando hago clic en algún botón dentro de la vista.Descubrí que configurar el gesto en deshabilitado solo no siempre funciona. Funciona, pero para mí solo funcionó después de usar una vez el backgesture. La segunda vez no activaría el backgesture.
La solución para mí fue delegar el gesto e implementar el método shouldbegin para devolver NO:
fuente
viewWillAppear
aparece en la vista detrás de la vista actual. Esto puede causar estragos en la lógica del código ya que la vista actual todavía está activa. Podría ser la causa de tu accidente.enabled
necesarias las líneas sí / no? RegresasNO
degestureRecognizerShouldBegin
, ¿no es eso suficiente?Simplemente quite el reconocedor de gestos de NavigationController. Trabaja en iOS 8.
fuente
[self.navigationController.view addGestureRecognizer:self.navigationController.interactivePopGestureRecognizer]
alguna parte.A partir de iOS 8, la respuesta aceptada ya no funciona. Necesitaba detener el movimiento para descartar el gesto en la pantalla principal de mi juego, así que implementé esto:
fuente
He refinado un poco la respuesta de Twan porque:
nil
lleva a problemas de bloqueo cuando vuelve al controlador de vista raíz y hace un gesto de deslizamiento antes de navegar a otra parte.El siguiente ejemplo supone iOS 7:
fuente
Configure esto en root vc:
fuente
Para Swift:
fuente
A mí me funciona en iOS 10 y posteriores:
no funciona en el método viewDidLoad ().
fuente
EDITAR
Si desea administrar la función de deslizar hacia atrás para controladores de navegación específicos, considere usar SwipeBack .
Con esto, puedes configurar
navigationController.swipeBackEnabled = NO
.Por ejemplo:
Se puede instalar a través de CocoaPods .
Pido disculpas por falta de explicación.
fuente
self.navigationController.swipeBackEnabled = NO
, estoy bastante seguro de que esto solo deshabilitará su gesto de deslizar hacia atrás de la biblioteca, pero el sistema todavía estará habilitado.Mi metodo Un reconocedor de gestos para gobernarlos a todos:
Importante: no reinicie el delegado en ningún lugar de la pila de navegación:
navigationController!.interactivePopGestureRecognizer!.delegate = nil
fuente
Este es el camino en Swift 3
funciona para mi
fuente
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:
donde myPanGestureRecognizer es el reconocedor de gestos que está utilizando para, por ejemplo, mostrar su menú. De esa forma, el gestor de reconocimiento de gestos de Apple no se vuelve a activar cuando presionas un nuevo controlador de navegación y no necesitas depender de retrasos extravagantes que pueden activarse demasiado temprano si tu teléfono se pone en suspensión o bajo una carga pesada.
Dejando esto aquí porque sé que no recordaré esto la próxima vez que lo necesite, y luego tendré la solución al problema aquí.
fuente
swift 5, swift 4.2 puede usar el código de abajo.
fuente
Ninguna de las respuestas dadas me ayudó a resolver el problema. Publicando mi respuesta aquí; puede ser útil para alguien
Declare
private var popGesture: UIGestureRecognizer?
como variable global en su viewcontroller. Luego implemente el código en los métodos viewDidAppear y viewWillDisappearEsto deshabilitará deslizar hacia atrás en iOS v8.x en adelante
fuente
interactivePopGestureRecognizer.delegate
.if( .. respondsToSelector ..
. La siguiente línea establece popGesture en un reconocedor o en cero. A continuación, utilice su valor:if (self.popGesture != nil) self.navigationController .. removeGestureRecognizer( self.popGesture )
.Esto funciona
viewDidLoad:
para iOS 8:Muchos de los problemas podrían resolverse con la ayuda del buen ol '
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 retraso 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)
fuente
viewDidLoad
Además el retraso es una práctica de programación arriesgada. Un mal hábito para comenzar. ¿Qué sucede si el usuario inicia el deslizamiento antes de que se inicie su llamada demorada? No hay un tiempo seguro que se garantice que sea lo suficientemente largo, pero no demasiado. Es por eso que otras respuestas, publicadas mucho antes que la suya, sugieren colocar el códigoviewDidAppear
. Eso asegura que todo esté instalado. No invente retrasos arbitrarios; use la secuencia de llamadas de Apple según lo previsto.Para Swift 4 esto funciona:
fuente
Funcionó para mí para la mayoría de los controladores de vista.
No funcionaba para algunos controladores de vista como UIPageViewController. En la página UIPageViewControllercontentviewcontroller debajo del código funcionó para mí.
En UIGestureRecognizerDelegate,
fuente