Интерактивный польский жест UINavigationController не работает?

Итак, у меня есть контроллер навигации в моем приложении для iOS 7. Загорается titleView, а также кнопка назад и панель навигации. По какой-то причине интерактивный поп-жест (проведите по левому краю) не работает. Ничего не произошло. Когда я записываю жест, это не ноль. Есть ли что-то особенное, что я должен сделать, чтобы включить эту функциональность? Что может заставить его не работать?

Ответы

Ответ 1

Eh, похоже, мне просто нужно было установить делегат gesture и реализовать следующее:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {

    return YES;

}

Ответ 2

Я обнаружил, что при использовании пользовательских кнопок "назад" интерактивный поп-жест перестает работать (я считаю, что Apple не может предвидеть, как будет работать ваша пользовательская кнопка "назад", поэтому они отключат этот жест).

Чтобы исправить это, как уже упоминалось ранее, вы можете установить для свойства interactivePopGestureRecognizer.delegate значение nil.

В Swift, это можно легко сделать через все ваше приложение, добавив расширение для UINavigationController, как этот:

extension UINavigationController {

    override public func viewDidLoad() {
        super.viewDidLoad()
        interactivePopGestureRecognizer?.delegate = nil
    }

}

Обновленный ответ

Кажется, что настройка делегата на nil приводит к зависанию пользовательского интерфейса приложения в некоторых сценариях (например, когда пользователь выполняет поиск влево или вправо на контроллере верхнего уровня стека навигации).

Поскольку метод делегата gestureRecognizerShouldBegin не может обрабатываться в расширении, подкласс UINavigationController кажется лучшим решением:

class NavigationController: UINavigationController, UIGestureRecognizerDelegate {

    /// Custom back buttons disable the interactive pop animation
    /// To enable it back we set the recognizer to `self`
    override func viewDidLoad() {
        super.viewDidLoad()
        interactivePopGestureRecognizer?.delegate = self
    }

    func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
        return viewControllers.count > 1
    }

}

Ответ 3

Посмотрите на ответ и комментарии. Все, что вам нужно сделать, - установить делегат распознавателя распознавания жестов в навигационном контроллере на nil:

self.navigationController.interactivePopGestureRecognizer.delegate = nil;

Установка его в литой self на id<UIGestureRecognizerDelegate> также работает, потому что все методы в протоколе являются необязательными, но я думаю, что установка этого делегата на nil более подходит в этом случае.

Ответ 4

Вы можете поместить эту строку в метод viewDidLoad.

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;

Ответ 5

Более выработанным ответом были как Aaron, так и lojals

Сначала настройте контроллер навигации, а затем поместите этот код в класс

В ViewDidload введите эту строку:

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;

И в классе напишите эту функцию

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES;}

Ответ 6

Мой ответ основан на ответе Eneko, но использует только расширения для UINavigationController и работает в Swift 5:

extension UINavigationController: UIGestureRecognizerDelegate {

    override open func viewDidLoad() {
        super.viewDidLoad()
        interactivePopGestureRecognizer?.delegate = self
    }

    public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        return viewControllers.count > 1
    }
}

Ответ 7

Может быть, кто-то может найти это полезным.

Если вы хотите скрыть панель навигации, но используйте обычные жестовые салфетки для возврата и другие функции навигационного контроллера, вы должны использовать: (navigationBar)

self.navigationController?.navigationBar.isHidden = true

Если вы хотите отключить навигационную панель (скрыть навигационную панель, отключить прокрутку назад), но хотите нажать viewcontroller, вы должны использовать: (isNavigationBarHidden)

self.navigationController?.isNavigationBarHidden = true

Обновление 7-DEC-2018:

В случае, если ваш первый контроллер использует скрытую навигационную панель, но следующие дочерние элементы используют панель навигации, когда вы вернетесь к контроллеру базового представления, вместо панели навигации вы увидите черную полосу перехода. Это будет очень легко исправляться, если вы используете в первом диспетчере представлений (отца):

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.setNavigationBarHidden(true, animated: animated)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    self.navigationController?.setNavigationBarHidden(false, animated: animated)
}

Ответ 8

В Swift 4 у меня есть UITableView внутри моего контроллера представления, я решил эту проблему:

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.interactivePopGestureRecognizer?.delegate=nil
}

Ответ 9

Как правило, добавьте интерактивный жест популярности ко всему приложению.

XCODE: 9.0, Swift: 4.0

Желательно создать UINavigationController в AppDelegate.swift

  1. Создать навигационный контроллер
// I created a global variable, however not necessarily you will be doing this way
var nvc: UINavigationController!
  1. реализовать UIGestureRecognizerDelegate
class AppDelegate: UIResponder, UIApplicationDelegate, UIGestureRecognizerDelegate {
  1. Instantiat UINavigationController в приложении didFinishLaunchingWithOptions function
nvc=UINavigationController()

// For interactive pop gesture
nvc.navigationBar.isHidden=true
nvc?.interactivePopGestureRecognizer?.delegate=self
  1. Дополнительный шаг, добавление контроллера к контроллеру навигации в приложении didFinishLaunchingWithOptions function
window=UIWindow()
window?.rootViewController=nvc
window?.makeKeyAndVisible()

// BaseViewController is sample controller i created with xib
nvc.pushViewController(BaseViewController(), animated: true)
  1. Реализуйте распознаватель gusture, добавьте приведенный ниже код в AppDelegate.swift
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }



Примечание: см. другой пост в этом разделе, чтобы узнать разницу между

self.navigationController?.navigationBar.isHidden=true

И

self.navigationController?.isNavigationBarHidden = true