Подтвердить что ты не робот

Отключить жест жесткой передачи в Swift

Некоторое время я оглядывался по сторонам, но, похоже, не нашел рабочего решения.

Я пытаюсь отключить пролистывание, чтобы вернуться к предыдущему виду жеста в Swift.

Я пробовал множество решений, в том числе:

self.navigationController?.interactivePopGestureRecognizer.enabled = false

а также

self.navigationController.interactivePopGestureRecognizer.delegate = self

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

Есть ли новый метод выполнения этого или какой-то другой метод, который работает?

4b9b3361

Ответ 1

Вы можете отключить его, но это не рекомендуется, так как большинство пользователей iOS возвращаются, проводя пальцем, а меньше нажимая кнопку "Назад". Если вы хотите отключить его, было бы более разумно использовать modal segue вместо push-перехода, который не так уж важен для передачи. Если вы действительно хотите избавиться от функции прокрутки, чтобы вернуться назад, я просто отключил бы кнопку "Назад" и сделал бы кнопку "Готово" в правом верхнем углу экрана.

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

Ответ 2

Ниже приведен простой подход к отключению и повторному включению прокрутки.

Swift 3.x и вверх

В методе viewDidLoad/willAppear/didAppear добавьте:

navigationController?.interactivePopGestureRecognizer?.isEnabled = false

Просто имейте в виду, что если вы сделаете это с помощью viewDidLoad, то при следующем открытии представления он может не быть установлен в зависимости от того, остается ли он в вашем стеке.

Если вы не хотите, чтобы он оставался выключенным, вам нужно будет включить его обратно, когда вид закрыт через willMove(toParentViewController:) или willDisappear. Ваш navigationController будет равен нулю в viewDidDisappear, так что это слишком поздно.

navigationController?.interactivePopGestureRecognizer?.isEnabled = true

Специальное примечание к SplitViewControllers:

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

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

Swift 2.2 и Objective-C

Быстрые версии 2.x и ниже:

navigationController?.interactivePopGestureRecognizer?.enabled

Objective-C:

self.navigationController.interactivePopGestureRecognizer.enabled

Ответ 3

Я смог сделать это, вернув false в 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
}

Ответ 4

Ничего плохого в ответе от Хари или Стефана, но это более красноречиво. Просто поместите его в viewDidLoad, и все готово.

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

EDIT:

Одно небольшое предостережение состоит в том, что если контроллер навигации был открыт другим видом и контроллер навигации закрыт, вы получите сообщение об ошибке EXC_BAD_ACCESS. Чтобы исправить это, вы должны сохранить оригинальный UIGestureRecognizer и вернуть его при выходе из представления.

Declare:

private var popGesture: UIGestureRecognizer?

Непосредственно перед удалением жестов:

popGesture = navigationController!.interactivePopGestureRecognizer

Затем при закрытии представления:

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

Ответ 5

для цели -c

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

  self.navigationController.interactivePopGestureRecognizer.enabled = NO;

}

Ответ 6

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

В этом сценарии я использовал:

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

в viewWillAppear() на последнем экране. Вы можете отменить их в viewWillDisappear(), если вы нажимаете другое представление и нуждаетесь в них там.

Ответ 7

Логика RowanPD для 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

Это то, что вы пропустили, если оно не работает после того, как вы все перепробовали.

  1. Добавьте navigationController?.interactivePopGestureRecognizer?.isEnabled = false в ваш метод viewWillAppear (animated :).
  2. если это не работает, удалите делегат навигации из контроллера представления. Проверьте еще раз, если ваш контроллер представления подтверждает протоколы UINavigationControllerDelegate, UIGestureRecognizerDelegate. если так, просто удалите это.

Ответ 9

Если требуется показать боковое меню на некоторых экранах, добавьте AddScreenEdgePanGesture в этот конкретный вид вместо представления navigationController.

замени это

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

с этим

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