ios - pay - tela acender com notificação iphone




Como desabilitar o gesto de passar o dedo no UINavigationController no iOS 7 (11)

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 meu menu personalizado à esquerda. Então, é possível desabilitar esse novo gesto no UINavigationController?


EDITAR

Se você quiser gerenciar o recurso de retorno para controladores de navegação específicos, considere o uso do SwipeBack .

Com isso, você pode definir navigationController.swipeBackEnabled = NO .

Por exemplo:

#import <SwipeBack/SwipeBack.h>

- (void)viewWillAppear:(BOOL)animated
{
    navigationController.swipeBackEnabled = NO;
}

Pode ser instalado via CocoaPods .

pod 'SwipeBack', '~> 1.0'

Eu peço desculpas por falta de explicação.


A partir do iOS 8, a resposta aceita não funciona mais. Eu precisava parar o swipping para dispensar o gesto na tela principal do jogo, então implementei isso:

- (void)viewDidAppear:(BOOL)animated
{
     [super viewDidAppear:animated];

if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
    self.navigationController.interactivePopGestureRecognizer.delegate = self;
    }
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
    self.navigationController.interactivePopGestureRecognizer.delegate = nil;
    }

}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
     return NO;
}

Descobri que definir o gesto como desativado só nem sempre funciona. Funciona, mas para mim só aconteceu depois que usei o backgesture. Segunda vez não acionaria o backgesture.

A solução para mim foi delegar o gesto e implementar o método shouldbegin para retornar NO:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    // Disable iOS 7 back gesture
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.navigationController.interactivePopGestureRecognizer.enabled = NO;
        self.navigationController.interactivePopGestureRecognizer.delegate = self;
    }
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    // Enable iOS 7 back gesture
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.navigationController.interactivePopGestureRecognizer.enabled = YES;
        self.navigationController.interactivePopGestureRecognizer.delegate = nil;
    }
}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    return NO;
}

Este é o caminho no Swift 3

funciona para mim

    self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false

Eu refinei a resposta de Twan um pouco, porque:

  1. o seu controlador de visualização pode ser definido como um delegado para outros reconhecedores de gestos
  2. definir o delegado como nil leva a problemas pendentes quando você volta para o controlador de visualização raiz e faz um gesto de deslizamento antes de navegar em outro lugar.

O exemplo a seguir assume o iOS 7:

{
    id savedGestureRecognizerDelegate;
}

- (void)viewWillAppear:(BOOL)animated
{
    savedGestureRecognizerDelegate = self.navigationController.interactivePopGestureRecognizer.delegate;
    self.navigationController.interactivePopGestureRecognizer.delegate = self;
}

- (void)viewWillDisappear:(BOOL)animated
{
    self.navigationController.interactivePopGestureRecognizer.delegate = savedGestureRecognizerDelegate;
}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    if (gestureRecognizer == self.navigationController.interactivePopGestureRecognizer) {
        return NO;
    }
    // add whatever logic you would otherwise have
    return YES;
}

Funcionou para mim para a maioria dos controladores de visualização.

self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false

Não estava funcionando para alguns viewcontrollers como o UIPageViewController. No codecontentviewcontroller de UIPageViewController abaixo código funcionou para mim.

override func viewDidLoad() {
   self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
   self.navigationController?.interactivePopGestureRecognizer?.delegate = self
}
override func viewWillDisappear(_ animated: Bool) {
   self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
   self.navigationController?.interactivePopGestureRecognizer?.delegate = nil
}

No UIGestureRecognizerDelegate,

func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
   if gestureRecognizer == self.navigationController?.interactivePopGestureRecognizer {
      return false
}
      return true
}

Meu método. Um reconhecedor de gestos para governar todos eles:

class DisabledGestureViewController: UIViewController: UIGestureRecognizerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        navigationController!.interactivePopGestureRecognizer!.delegate = self
    }

    func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
        // Prevent going back to the previous view
        return !(navigationController!.topViewController is DisabledGestureViewController)
    }
}

Importante: não redefina o delegado em qualquer lugar na pilha de navigationController!.interactivePopGestureRecognizer!.delegate = nil : navigationController!.interactivePopGestureRecognizer!.delegate = nil


Nenhuma das respostas dadas 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 viewWillDisappear

override func viewDidAppear(animated: Bool) {

    super.viewDidAppear(animated)

    if self.navigationController!.respondsToSelector(Selector("interactivePopGestureRecognizer")) {

        self.popGesture = navigationController!.interactivePopGestureRecognizer
        self.navigationController!.view.removeGestureRecognizer(navigationController!.interactivePopGestureRecognizer!)
    }
}


override func viewWillDisappear(animated: Bool) {

    super.viewWillDisappear(animated)

    if self.popGesture != nil {
        navigationController!.view.addGestureRecognizer(self.popGesture!)
    }
}

Isso desativará a passagem de volta no iOS v8.x em diante


Para o Swift 4 isso funciona:

class MyViewController: UIViewController, UIGestureRecognizerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.navigationController?.interactivePopGestureRecognizer?.gesture.delegate = self
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)

        self.navigationController?.interactivePopGestureRecognizer?.gesture.isEnabled = false
    }

}

Por favor, defina isso no root vc:

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:YES];
    self.navigationController.interactivePopGestureRecognizer.enabled = NO;

}

-(void)viewDidDisappear:(BOOL)animated{
    [super viewDidDisappear:YES];
    self.navigationController.interactivePopGestureRecognizer.enabled = YES;
}

funciona para mim no ios 10 e posterior:

- (void)viewWillAppear:(BOOL)animated {
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.navigationController.interactivePopGestureRecognizer.enabled = NO;
    }

}

ele não funciona no método viewDidLoad ().





ios7