No iOS 7, a Apple adicionou um novo comportamento de navegação padrão. Você pode deslizar a partir da borda esquerda da tela para voltar à pilha de navegação. Mas no meu aplicativo, esse comportamento entra em conflito com o meu menu esquerdo personalizado. Portanto, é possível desativar esse novo gesto no UINavigationController?
326
navigationItem.hidesBackButton = true
, esse gesto também será desativado. No meu caso, eu implementei um botão voltar personalizado e adicionei comoleftBarButtonItem
Respostas:
Encontrei uma solução:
Objetivo-C:
Swift 3+:
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
fonte
enable / disable
reconhecer emviewDidAppear:
/viewDidDisappear
. Ou, você pode implementar oUIGestureRecognizerDelegate
protocolo com sua lógica mais complexa e configurá-lo comorecognizer.delegate
propriedade.self.navigationController.interactivePopGestureRecognizer.enabled
propriedade não funciona nos seguintes métodos de visualização:viewDidLoad
,viewWillAppear
,viewDidAppear
,viewDidDisappear
, mas obras no métodoviewWillDisappear
. No iOS7, ele funciona em todos os métodos mencionados acima. Portanto, tente usá-lo em qualquer outro método enquanto estiver trabalhando no viewController, confirmo que funciona para mim no iOS8 quando clico em algum botão dentro da visualização.Eu descobri que definir o gesto como desativado nem sempre funciona. Funciona, mas para mim só funcionou depois que uma vez usei o backgesture. Segunda vez, não desencadearia a backgesture.
A correção para mim foi delegar o gesto e implementar o método shouldbegin para retornar NO:
fonte
viewWillAppear
é chamado na exibição por trás da exibição atual. Isso pode causar estragos na lógica do código, pois a visualização atual ainda está ativa. Pode ser a causa do seu acidente.enabled
linhas sim / não são necessárias? Você voltaNO
degestureRecognizerShouldBegin
, não é suficiente?Basta remover o reconhecedor de gestos do NavigationController. Trabalhe no iOS 8.
fonte
[self.navigationController.view addGestureRecognizer:self.navigationController.interactivePopGestureRecognizer]
algum lugar.A partir do iOS 8, a resposta aceita não funciona mais. Eu precisava interromper o swipping para descartar o gesto na tela principal do jogo, para implementar isso:
fonte
Refinei um pouco a resposta de Twan, porque:
nil
leva a problemas pendentes quando você volta ao controlador de visualização raiz e faz um gesto de deslizar antes de navegar para outro lugar.O exemplo a seguir assume o iOS 7:
fonte
Defina isso na raiz vc:
fonte
Para Swift:
fonte
funciona para mim no ios 10 e posterior:
ele não funciona no método viewDidLoad ().
fonte
EDITAR
Se você deseja gerenciar o recurso deslizar para trás para controladores de navegação específicos, considere usar o SwipeBack .
Com isso, você pode definir
navigationController.swipeBackEnabled = NO
.Por exemplo:
Pode ser instalado via CocoaPods .
Peço desculpas por falta de explicação.
fonte
self.navigationController.swipeBackEnabled = NO
, tenho certeza de que isso apenas desabilitará o seu gesto . o gesto de deslizar para trás da biblioteca, mas o do sistema ainda estará ativado.Meu método Um reconhecedor de gestos para governar todos eles:
Importante: não redefina o delegado em nenhum lugar da pilha de navegação:
navigationController!.interactivePopGestureRecognizer!.delegate = nil
fonte
Este é o caminho no Swift 3
funciona para mim
fonte
Todas essas soluções manipulam o reconhecedor de gestos da Apple de uma maneira que não são recomendadas. Acabei de ser informado por um amigo que existe uma solução melhor:
onde myPanGestureRecognizer é o reconhecedor de gestos que você está usando para, por exemplo, mostrar seu menu. Dessa forma, o reconhecedor de gestos da Apple não é ativado novamente quando você pressiona um novo controlador de navegação e não precisa contar com atrasos hacky que podem disparar muito cedo se o telefone for colocado no modo de suspensão ou sob carga pesada.
Deixando isso aqui porque sei que não me lembrarei disso da próxima vez que precisar e, então, terei a solução para o problema aqui.
fonte
swift 5, swift 4.2 pode usar o código abaixo.
fonte
Nenhuma das respostas fornecidas me ajudou a resolver o problema. Postando minha resposta aqui; pode ser útil para alguém
Declare
private var popGesture: UIGestureRecognizer?
como variável global em seu viewcontroller. Em seguida, implemente o código nos métodos viewDidAppear e viewWillDisappearIsso desativará o furto no iOS v8.x em diante
fonte
interactivePopGestureRecognizer.delegate
.if( .. respondsToSelector ..
. A próxima linha define popGesture para um reconhecedor ou para zero. Em seguida, use o seu valor:if (self.popGesture != nil) self.navigationController .. removeGestureRecognizer( self.popGesture )
.Isso funciona no
viewDidLoad:
iOS 8:Muitos dos problemas poderiam ser resolvidos com a ajuda do bom e velho
dispatch_after
.Embora observe que esta solução é potencialmente insegura, use seu próprio raciocínio.
Atualizar
Para iOS 8.1, o tempo de atraso deve ser de 0,5 segundos
No iOS 9.3, não é mais necessário um atraso, ele funciona apenas colocando isso em seu
viewDidLoad
:(TBD se funciona no iOS 9.0-9.3)
fonte
viewDidLoad
mais atraso é uma prática de programação arriscada. Um mau hábito para começar. E se o usuário iniciar o furto antes que sua chamada atrasada comece? Não há tempo seguro que seja garantido por tempo suficiente, mas não por muito tempo. É por isso que outras respostas, postadas muito antes da sua, sugerem a inserção do códigoviewDidAppear
. Isso garante que tudo esteja instalado. Não invente atrasos arbitrários; use a sequência de chamadas da Apple como pretendido.Para o Swift 4, isso funciona:
fonte
Funcionou para mim para a maioria dos controladores de exibição.
Não estava funcionando para alguns controladores de exibição como o UIPageViewController. No pagecontentviewcontroller do UIPageViewController, o código abaixo funcionava para mim.
Em UIGestureRecognizerDelegate,
fonte