Así que tengo un controlador de navegación en mi construido para iOS 7 app. El titleView es visible, así como el botón de atrás y la barra de navegación de su auto. Por alguna razón, el interactivo pop gesto (deslice el dedo rápidamente desde el borde izquierdo) no está funcionando. No pasa nada. Cuando me registro el gesto, no es nil. Hay algo en especial que tengo que hacer para habilitar esta funcionalidad? ¿Qué podría causar que no funcione?

9 Comentarios

  1. 55

    He encontrado que cuando el uso personalizado de los botones de la espalda, el interactivo pop gesto deja de trabajar (mi opinión es que Apple no puede prever cómo personalizado botón atrás se comportan, por lo que desactivar el gesto).

    Para solucionar este problema, como otras mencionado antes, puede establecer el interactivePopGestureRecognizer.delegate propiedad nil.

    De Swift, esto se puede hacer fácilmente a través de su aplicación mediante la adición de una extensión para UINavigationController como este:

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

    Respuesta actualizada

    Parece establecer el delegado de nil causas de la aplicación de interfaz de usuario para congelar en algunos casos (por ejemplo. cuando el usuario pasa a la izquierda o a la derecha en la parte superior de controlador de vista de la pila de navegación).

    Porque gestureRecognizerShouldBegin delegado método no puede ser manejado en una extensión, subclases UINavigationController parece que 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
        }
    
    }
    • Esto parece funcionar, pero resulta que bajo ciertas circunstancias se congela la aplicación. Yo creo que ocurre cuando el interactivo pop gesto se activa, mientras que un controlador de vista está siendo empujado. La forma más segura sería la subclase UINavigationController. En la subclase conjunto de la interactivePopGestureRecognizer.delegate a sí mismo y evitar la interactivos pop gesto de ser reconocido, mientras que un nuevo controlador de vista es empujado.
    • De hecho, he encontrado que el problema también parece afectar sólo a la parte superior de controlador de vista de la navegación controlador de la pila. He actualizado mi respuesta con una solución diferente, basado en la creación de subclases.
    • Alonso perfecto! Tal y como lo dijo, si el usuario pasa a la izquierda o a la derecha y, a continuación, pulsa en un botón de empuje de vista controlador es glitched. Creación de subclases se soluciona el problema al 100%
    • Estoy teniendo un problema similar, cuando me puse la barra de navegación oculta. Me suelta el pase atrás de la funcionalidad. Existe de todos modos que usted puede ayudar con esto? He publicado esta pregunta para mayor claridad: stackoverflow.com/questions/48954413/…
  2. 27

    Eh, mira como me acaba de establecer el gesto delegado y poner en práctica las siguientes:

    -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    
        return YES;
    
    }
    • He comprobado esto, pero muy espeluznante problema, cuando tengo esta fija, a continuación, si el usuario se desliza a mitad de camino y luego volver veo el siguiente controlador superpuesta sobre la anterior controlador de vista. Veo que la Anterior vista y controlador de la siguiente superpuesta es transparente como el cristal transparente. De manera que el usuario pasa a ser bloqueado este estado. Cualquier idea. Esto es algo que Ver la aparición de / aparecerá problema de gestión.
    • esto funcionó genial, muchas gracias!
  3. 18

    Vistazo a este respuesta y comentarios. Todo lo que tienes que hacer es configurar su controlador de navegación interactiva del pop gesto de reconocimiento del delegado de nil:

    self.navigationController.interactivePopGestureRecognizer.delegate = nil;

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

    • sólo he tenido éxito con esto, cuando en viewDidAppear
    • Este «funciona», pero poco después de que hace muy extraño problemas hasta el punto de congelación de la aplicación (probado con iOS 8, el dispositivo)
  4. 12

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

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

    El más trabajado fue la respuesta a Aarón y a lojals

    Primera Personalizar la Navegación del controlador y, a continuación, poner este código en la clase

    En ViewDidload poner esta línea:

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

    Y en la clase de escritura esta función

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

    Mi respuesta está basada en Eneko la respuesta, pero utiliza sólo una de las extensiones de UINavigationController y trabaja en Swift 5:

    extension UINavigationController: UIGestureRecognizerDelegate {
    
        override open func viewDidLoad() {
            super.viewDidLoad()
            interactivePopGestureRecognizer?.delegate = self
        }
    
        public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
            return viewControllers.count > 1
        }
    }
    • no es trabajo para mí con IOS 13. Se tiene alguna sugerencia?
  7. 2

    Tal vez alguien puede encontrar útil esta información.

    Si quieres ocultar la barra de navegación, pero el uso normal deslizar gestos para ir de ida y otro de navegación características de la controladora, que se debe utilizar: (navigationBar)

    self.navigationController?.navigationBar.isHidden = true

    Si desea deshabilitar la barra de navegación para ocultar la barra de navegación, deshabilitar pase para atrás), pero que quieren empujar viewcontroller que se debe utilizar: (isNavigationBarHidden)

    self.navigationController?.isNavigationBarHidden = true

    Actualización 7-DIC-2018:

    Forma recomendada:

    En caso de que su primer controlador de utilizar la barra de navegación oculta, pero la próxima childs uso de la barra de navegación, cuando regrese a la base de controlador de vista, usted verá una barra de color negro en transición, en lugar de la barra de navegación. Esto será corregido muy fácil si se utiliza en primer viewcontroller(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)
    }
  8. 1

    En Swift 4, tengo un UITableView dentro de mi punto de vista controlador, he resuelto este problema con:

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

    Genéricamente agregar interactivo pop gesto a toda la aplicación.

    XCODE: 9.0, Swift: 4.0

    Preferiblemente crear UINavigationController en el AppDelegate.swift

    1. Crear un controlador de navegación
    //I created a global variable, however not necessarily you will be doing this way
    var nvc: UINavigationController!
    1. implementar UIGestureRecognizerDelegate
    class AppDelegate: UIResponder, UIApplicationDelegate, UIGestureRecognizerDelegate {
    1. Instantiat UINavigationController en aplicación didFinishLaunchingWithOptions función
    nvc=UINavigationController()
    
    //For interactive pop gesture
    nvc.navigationBar.isHidden=true
    nvc?.interactivePopGestureRecognizer?.delegate=self
    1. Paso adicional, agregue el controlador a controlador de navegación en la aplicación didFinishLaunchingWithOptions función
    window=UIWindow()
    window?.rootViewController=nvc
    window?.makeKeyAndVisible()
    
    //BaseViewController is sample controller i created with xib
    nvc.pushViewController(BaseViewController(), animated: true)
    1. Implementar gusture reconocedor, agregar a continuación el código a AppDelegate.swift
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
            return true
        }

    Nota: Ver otros post en esta sección de la diferencia entre

    self.navigationController?.navigationBar.isHidden=true

    Y

    self.navigationController?.isNavigationBarHidden = true

Dejar respuesta

Please enter your comment!
Please enter your name here