Отключить жест жесткой передачи в Swift
Некоторое время я оглядывался по сторонам, но, похоже, не нашел рабочего решения.
Я пытаюсь отключить пролистывание, чтобы вернуться к предыдущему виду жеста в Swift.
Я пробовал множество решений, в том числе:
self.navigationController?.interactivePopGestureRecognizer.enabled = false
а также
self.navigationController.interactivePopGestureRecognizer.delegate = self
func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer!) -> Bool {
return false
}
Есть ли новый метод выполнения этого или какой-то другой метод, который работает?
Ответы
Ответ 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?.interactivePopGestureRecognizer?.isEnabled = 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
Это то, что вы пропустили, если оно не работает после того, как вы все перепробовали.
- Добавьте
navigationController?.interactivePopGestureRecognizer?.isEnabled = false
в ваш метод viewWillAppear (animated :). - если это не работает, удалите делегат навигации из контроллера представления. Проверьте еще раз, если ваш контроллер представления подтверждает протоколы
UINavigationControllerDelegate
, UIGestureRecognizerDelegate
. если так, просто удалите это.
Ответ 9
Если требуется показать боковое меню на некоторых экранах, добавьте AddScreenEdgePanGesture в этот конкретный вид вместо представления navigationController.
замени это
SideMenuManager.default.menuAddScreenEdgePanGesturesToPresent(toView: self.navigationController?.view)
с этим
SideMenuManager.default.menuAddScreenEdgePanGesturesToPresent(toView: self.view)