it-swarm.com.ru

Как отключить автоматический жест, чтобы вернуться назад с помощью навигационного контроллера?

Поэтому я замечаю, что все мои представления получают жест, чтобы вернуться назад (всплывающее представление), когда пользователь проводит пальцем по левой стороне экрана (в любой ориентации) ( Это новое для iOS7 )

Я пытался пока безрезультатно отключить его, используя:

    [self.navigationItem setHidesBackButton:YES];

Внутри самого инициатора NavigationController (так как делегат, похоже, использует это).

22
Danoli3

oBJ-с

self.navigationController.interactivePopGestureRecognizer.enabled = NO;

Стриж

navigationController?.interactivePopGestureRecognizer?.isEnabled = false
72
Gabriele Petronella

Добавление к решению Габриэле.

Для поддержки любой iOS до iOS 7 вам нужно обернуть этот код следующим образом:

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

Это остановит сбой приложения в iOS 6 и iOS 5 из-за отсутствия селектора.

6
Danoli3

Я использую это решение в своем проекте, оно отключает только interactivePopGestureRecognizer и позволяет использовать другие распознаватели жестов.

- (void)viewDidLoad {

    [super viewDidLoad];

    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {

        self.navigationController.interactivePopGestureRecognizer.enabled = NO;
        self.navigationController.interactivePopGestureRecognizer.delegate = self;

    }

}


- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {

    if ([gestureRecognizer isEqual:self.navigationController.interactivePopGestureRecognizer]) {

        return NO;

    } else {

        return YES;

    }

}
5
Userich

Я обнаружил, что установка жеста на отключение не всегда работает. Это работает, но для меня это только после того, как я однажды использовал backgesture. Во второй раз это не вызовет спину.

Исправление для меня состояло в том, чтобы делегировать жест и реализовать метод shouldbegin для возврата 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;
}
4
Antoine

Для IOS 8 (Swift):

class MainNavigationController: UINavigationController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.interactivePopGestureRecognizer.enabled = false

        // Do any additional setup after loading the view.
    }

}
3
ilan

Используйте этот код для предыдущих, чем iOS 7

if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
    self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}
0
Shardul