Estado buscando alrededor por un tiempo, pero parece que no puede encontrar una solución de trabajo.

Estoy tratando de desactivar el dedo para volver a la vista anterior gesto, en Swift.

He probado una gran variedad de soluciones que incluyen:

self.navigationController?.interactivePopGestureRecognizer.enabled = false

y

self.navigationController.interactivePopGestureRecognizer.delegate = self

func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer!) -> Bool {
    return false
}

Hay un nuevo método de hacer esto o algún otro método que funciona?

  • Esto causa un problema cuando un usuario no es totalmente deslizar el dedo, e interfiere con la naturaleza de la interfaz de usuario que estamos utilizando (en busca del tiempo en una pista de audio)
  • Bueno, no quiero hacer fracasar tu pregunta, pero te sugiero que (1) resolver la no-totalmente-deslice problema y (2) la sangría de su pista de audio en busca de interfaz de usuario de modo que no es tan cerca de la orilla. Se espera que esto UX, y es especialmente importante para el iPhone 6 Plus y los usuarios de iPad, donde en una especie de molestia para llegar a la barra de navegación.
  • De todos modos, el código debe desactivar el gesto de reconocimiento. Funciona en versiones anteriores de iOS?
  • Ah buen punto sobre el iPhone 6 – tal vez voy a mirar a modificar el método dealloc – pero voy a dejar abierta la pregunta como estoy interesado, no obstante,
  • Yo estoy probando en iOS 8 como mínimo
  • Yo era capaz de hacerlo con devolviendo false en gestureRecognizerShouldBegin. Está usted recibiendo de devolución de llamada en gestureRecognizerShouldBegin ? Tal vez usted poner este código en mal vista controlador…

InformationsquelleAutor Phil Hudson | 2015-07-30

9 Comentarios

  1. 10

    Puede desactivar, pero que no sería recomendable como la mayoría de los usuarios de iOS volver al deslizar y menos pulsando el botón atrás.
    Si desea desactivar sería más razonable utilizar un modal segue en lugar de empujar un pase que no es tan grande de una transferencia.
    Si usted realmente quiere deshacerse de el pase para ir de vuelta la función acabo de desactivar el botón de atrás y tiene un botón hecho en la parte superior derecha de la pantalla.

    self.navigationController?.navigationItem.backBarButtonItem?.isEnabled = false;
  2. 118

    El siguiente es un enfoque sencillo para deshabilitar & volver a habilitar el pase de vuelta.

    Swift 3.x & hasta

    En un viewDidLoad/willAppear/didAppear método de agregar:

    navigationController?.interactivePopGestureRecognizer?.isEnabled = false

    Sólo ten en cuenta que si lo haces con viewDidLoad, entonces la próxima vez que abra la vista, no puede ser ajustado dependiendo de si es o no permanece en la pila.

    A menos que usted desea permanecer apagado, usted tendrá que activar de nuevo cuando se cierra la vista ya sea a través de willMove(toParentViewController:) o willDisappear. Su navigationController será nula en viewDidDisappear, a fin de que sea demasiado tarde.

    navigationController?.interactivePopGestureRecognizer?.isEnabled = true

    Una nota especial sobre SplitViewControllers:

    Como se ha señalado por CompC en los comentarios, usted tendrá que llamar a la segunda navegación controlador de aplicarlo a una vista de detalle como tal:

    navigationController?.navigationController?.interactivePopGe‌​stureRecognizer?.isE‌​nabled = false

    Swift 2.2 & Objective-C

    Swift versiones 2.x & abajo:

    navigationController?.interactivePopGestureRecognizer?.enabled

    Objective-C:

    self.navigationController.interactivePopGestureRecognizer.enabled
    • Yo estaba teniendo un poco de problemas para conseguir que esto funcione, hasta que me di cuenta de que, desde el punto de vista controlador que yo estaba tratando de desactivar esto fue en el detalle del lado de la División de Controlador de Vista, es técnicamente por separado, en un navigation controller (aunque, cuando se derrumbó, parece que en el mismo controlador). Para evitar esto yo tenía que hacer: navigationController?.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
    • Gracias por la actualización, nunca tuvo ese escenario, así que es bueno saber.
    • es suficiente para desactivarlo en didAppear, y volver a habilitarla en willDisappear. Sobre todo, volver a activarlo en didDisappear es inútil, porque navigationController propiedad es nula ya.
    • Gracias, esta debería ser la Respuesta Correcta
    • Es posible desactivar esta en a través de la aplicación? como código en el AppDelegate etc.?
    • Sí, crear una subclase de UINavigationController, y, a continuación, establezca la propiedad en su viewDidLoad. Mientras el nav controlador es utilizado por todos los puntos de vista que usted desea dentro de la aplicación, va a trabajar.
    • muchas gracias.. su trabajo…
    • Pensé en señalar que interactivePopGestureRecorgizer no puede ser inicializado dependiendo de cuando y donde se intenta establecer navigationController?.interactivePopGestureRecognizer?.isEnabled = false. Estoy usando los coordinadores y este fue nula después de que yo iniciara la NavController y antes de que me empujó a la primera ViewController.
    • Gracias @TMin, la he usado cuando se inicia la navegación de los controladores sin incidentes, pero es útil para ver los puntos donde se desliza a través de.

  3. 18

    Yo era capaz de hacer esta devolviendo false en gestureRecognizerShouldBegin

    class ViewController2: UIViewController, UIGestureRecognizerDelegate {
    ...
    override func viewDidLoad() {
        super.viewDidLoad()
        //Do any additional setup after loading the view.
        self.navigationController?.interactivePopGestureRecognizer.delegate = self
    }
    
    func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
        return false
    }
    • Nota UIGestureRecognizer! en la OP del código vs UIGestureRecognizer aquí.
  4. 5

    Nada malo con cualquiera de respuesta de Hari o Stefan, pero este es más sucinto. Acaba de poner en viewDidLoad y listo.

    if navigationController!.respondsToSelector(Selector("interactivePopGestureRecognizer")) {
        navigationController!.view.removeGestureRecognizer(navigationController!.interactivePopGestureRecognizer)
    }

    EDICIÓN:

    Una pequeña advertencia es que si el Controlador de Navegación, que fue inaugurado por otro punto de vista y el Controlador de Navegación es cerrado, entonces obtendrá un EXC_BAD_ACCESS de error. Para solucionarlo tienes que guardar el original UIGestureRecognizer y poner de nuevo al salir de la vista.

    Declarar:

    private var popGesture: UIGestureRecognizer?

    Inmediatamente antes de quitar el gesto:

    popGesture = navigationController!.interactivePopGestureRecognizer

    A continuación, cuando el cierre de la vista:

    If popGesture != nil {
        navigationController!.view.addGestureRecognizer(popGesture!)
    }
    • este trabajó como un encanto
  5. 3

    para objective-c

    -(void)viewWillAppear:(BOOL)animated{
      [super viewWillAppear:true];
    
      self.navigationController.interactivePopGestureRecognizer.enabled = NO;
    
    }
  6. 2

    Yo generalmente asegúrese de que pase de nuevo está habilitado en tantos lugares como sea posible, incluso la adición de un gesto personalizado reconocedor de añadir modal pantallas. Sin embargo, para una autenticación y el proceso de descarga en mi aplicación de iniciar el proceso con un modal de navegación controlador y, a continuación, empuje la vista para cada siguiente paso. Sin embargo, una vez que se haya completado quiero para prevenir la copia de seguridad en la autenticación de las pantallas.

    Para este escenario he estado usando:

    navigationController?.interactivePopGestureRecognizer?.isEnabled = false
    navigationItem.hidesBackButton = true

    en viewWillAppear() en la pantalla final. Usted puede deshacer estas en viewWillDisappear() si usted está empujando otro punto de vista y la necesidad de ellos.

  7. 2

    RowanPD la lógica para Swift 4

    private var popGesture: UIGestureRecognizer?
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    
        if navigationController!.responds(to: #selector(getter: UINavigationController.interactivePopGestureRecognizer)) {
            self.popGesture = navigationController!.interactivePopGestureRecognizer
            self.navigationController!.view.removeGestureRecognizer(navigationController!.interactivePopGestureRecognizer!)
        }
    
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
    
        if let gesture = self.popGesture {
            self.navigationController!.view.addGestureRecognizer(gesture)
        }
    
    }
  8. 0

    Esto es algo que perder si no funciona después de que usted ha intentado todo.

    1. Agregar navigationController?.interactivePopGestureRecognizer?.isEnabled = false
      a su viewWillAppear(animado:) método.
    2. si no funciona, quite la navegación delegado de la vista controlador. Comprobar de nuevo si su controlador de vista se confirma UINavigationControllerDelegate, UIGestureRecognizerDelegate protocolos. si es así, quite la.
  9. 0

    Si el requisito es mostrar el menú de lado algunas de las pantallas, a continuación, agregue AddScreenEdgePanGesture en esta visión específica en lugar de navigationController ver

    reemplazarlo

    SideMenuManager.default.menuAddScreenEdgePanGesturesToPresent(toView: self.navigationController?.view)

    con este

    SideMenuManager.default.menuAddScreenEdgePanGesturesToPresent(toView: self.view)

Dejar respuesta

Please enter your comment!
Please enter your name here