В iOS 7 Apple добавила новое поведение навигации по умолчанию. Вы можете провести пальцем от левого края экрана, чтобы вернуться в стек навигации. Но в моем приложении это поведение противоречит моему левому меню. Итак, возможно ли отключить этот новый жест в UINavigationController?
326
navigationItem.hidesBackButton = true
, этот жест также отключается. В моем случае я реализовал пользовательскую кнопку возврата и добавил какleftBarButtonItem
Ответы:
Я нашел решение:
Objective-C:
Свифт 3+:
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
источник
enable / disable
узнать наviewDidAppear:
/viewDidDisappear
. Или вы можете реализоватьUIGestureRecognizerDelegate
протокол с более сложной логикой и установить его какrecognizer.delegate
свойство.self.navigationController.interactivePopGestureRecognizer.enabled
свойства не работает в следующих методов зрения в:viewDidLoad
,viewWillAppear
,viewDidAppear
,viewDidDisappear
, но работает в методеviewWillDisappear
. На iOS7 это работает всеми вышеперечисленными способами. Поэтому попробуйте использовать его в любых других методах при работе с viewController. Я подтверждаю, что он работает для меня на iOS8, когда я нажимаю на какую-то кнопку внутри представления.Я обнаружил, что установка жеста на отключение не всегда работает. Это работает, но для меня это только после того, как я однажды использовал backgesture. Во второй раз это не вызовет спину.
Исправление для меня состояло в том, чтобы делегировать жест и реализовать метод shouldbegin, возвращающий NO:
источник
viewWillAppear
вызывается в представлении позади текущего представления. Это может вызвать хаос в логике кода, так как текущее представление все еще активно. Может быть причиной вашего крушения.enabled
да / нет? Вы возвращаетесьNO
изgestureRecognizerShouldBegin
, разве этого не достаточно?Просто удалите распознаватель жестов из NavigationController. Работа в iOS 8.
источник
[self.navigationController.view addGestureRecognizer:self.navigationController.interactivePopGestureRecognizer]
где-нибудь.Начиная с iOS 8 принятый ответ больше не работает. Мне нужно было остановить движение, чтобы отклонить жест на экране основной игры, поэтому реализовал это:
источник
Я немного уточнил ответ Твана, потому что:
nil
приводит к зависанию проблем, когда вы возвращаетесь к корневому контроллеру представления и делаете жест смахивания перед переходом в другое место.В следующем примере предполагается iOS 7:
источник
Пожалуйста, установите это в root vc:
источник
Для Свифта:
источник
у меня работает в ios 10 и позже:
он не работает с методом viewDidLoad ().
источник
РЕДАКТИРОВАТЬ
Если вы хотите управлять функцией пролистывания назад для определенных контроллеров навигации, рассмотрите возможность использования SwipeBack .
С этим вы можете установить
navigationController.swipeBackEnabled = NO
.Например:
Его можно установить через CocoaPods .
Я прошу прощения за отсутствие объяснения.
источник
self.navigationController.swipeBackEnabled = NO
я уверен, что это отключит только ваш жест библиотеки назад, но системный будет включен.Мой метод. Один распознаватель жестов, чтобы управлять ими всеми:
Важно: не сбрасывайте делегат нигде в стеке навигации:
navigationController!.interactivePopGestureRecognizer!.delegate = nil
источник
Это путь на Swift 3
работает для меня
источник
Все эти решения манипулируют распознавателем жестов Apple так, как они не рекомендуют. Мне только что сказал друг, что есть лучшее решение:
где myPanGestureRecognizer - это распознаватель жестов, который вы используете, например, чтобы показать свое меню. Таким образом, распознаватель жестов Apple не включается ими, когда вы нажимаете на новый контроллер навигации, и вам не нужно полагаться на случайные задержки, которые могут сработать слишком рано, если ваш телефон находится в спящем режиме или под большой нагрузкой.
Оставив это здесь, потому что я знаю, я не запомню это в следующий раз, когда мне это понадобится, и тогда у меня будет решение проблемы здесь.
источник
Swift 5, Swift 4.2 можно использовать код ниже.
источник
Ни один из приведенных ответов не помог мне решить проблему. Размещение моего ответа здесь; может быть полезным для кого-то
Объявите
private var popGesture: UIGestureRecognizer?
как глобальную переменную в вашем viewcontroller. Затем реализовать код в viewDidAppear и viewWillDisappear методовЭто отключит пролистывание назад в iOS v8.x и далее.
источник
interactivePopGestureRecognizer.delegate
.if( .. respondsToSelector ..
. Следующая строка устанавливает popGesture в распознаватель или в ноль. Затем используйте его значение:if (self.popGesture != nil) self.navigationController .. removeGestureRecognizer( self.popGesture )
.Это работает
viewDidLoad:
для iOS 8:Многие проблемы могут быть решены с помощью доброго
dispatch_after
.Хотя обратите внимание, что это решение потенциально небезопасно, пожалуйста, используйте ваши собственные аргументы.
Обновить
Для iOS 8.1 время задержки должно составлять 0,5 секунды
В iOS 9.3 больше не требуется никаких задержек, это работает, просто поместив это в ваш
viewDidLoad
:(TBD, если работает на iOS 9.0-9.3)
источник
viewDidLoad
плюс задержка - рискованная практика программирования. Плохая привычка начинать. Что если пользователь запустит свайп до того, как начнется ваш отложенный звонок? Там нет безопасного времени, которое гарантированно будет достаточно долго, но не слишком долго. Вот почему другие ответы, опубликованные задолго до вашего, предлагают разместить код вviewDidAppear
. Это гарантирует, что все установлено. Не изобретайте произвольные задержки; используйте последовательность вызовов Apple, как задумано.Для Swift 4 это работает:
источник
У меня это работало для большинства контроллеров представления.
Это не работало для некоторых контроллеров представления, таких как UIPageViewController. На странице управления контентом UIPageViewController ниже код работал для меня.
На UIGestureRecognizerDelegate,
источник