在 Swift 中禁用向后滑动手势
Disable swipe back gesture in Swift
在这里四处寻找了一段时间,但似乎找不到可行的解决方案。
我试图在 Swift 中禁用滑动以返回上一个视图手势。
我尝试了多种解决方案,包括:
self.navigationController?.interactivePopGestureRecognizer.enabled = false
和
self.navigationController.interactivePopGestureRecognizer.delegate = self
func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer!) -> Bool {
return false
}
是否有新方法或其他有效方法?
您可以禁用它,但不建议这样做,因为大多数 iOS 用户通过滑动返回,而不是通过按下后退按钮返回。
如果你想禁用它,使用 modal segue
代替不是那么大的传输的推送 segue 会更合理。
如果你真的想摆脱滑动返回功能,我会禁用后退按钮并在屏幕右上角有一个完成按钮。
self.navigationController?.navigationItem.backBarButtonItem?.isEnabled = false;
我能够通过在 gestureRecognizerShouldBegin 中返回 false 来做到这一点
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
}
Hari 或 Stefan 的回答都没有错,但更简洁。只需将其放入 viewDidLoad 即可。
if navigationController!.respondsToSelector(Selector("interactivePopGestureRecognizer")) {
navigationController!.view.removeGestureRecognizer(navigationController!.interactivePopGestureRecognizer)
}
编辑:
一个小警告是,如果导航控制器被另一个视图打开并且导航控制器关闭,那么您将收到 EXC_BAD_ACCESS 错误。要修复它,您必须保存原始的 UIGestureRecognizer 并在退出视图时将其放回原处。
声明:
private var popGesture: UIGestureRecognizer?
在删除手势之前:
popGesture = navigationController!.interactivePopGestureRecognizer
然后关闭视图时:
If popGesture != nil {
navigationController!.view.addGestureRecognizer(popGesture!)
}
以下是禁用和重新启用向后滑动的简单方法。
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
Swift 版本 2.x 及以下:
navigationController?.interactivePopGestureRecognizer?.enabled
Objective-C:
self.navigationController.interactivePopGestureRecognizer.enabled
我通常会确保在尽可能多的地方启用向后滑动,甚至添加自定义手势识别器以将其添加到模态屏幕。但是,对于我的应用程序中的身份验证和下载过程,我使用模态导航控制器启动该过程,然后为每个下一步推送视图。但是,一旦完成,我想阻止他们备份到身份验证屏幕。
对于这个场景,我一直在使用:
navigationController?.interactivePopGestureRecognizer?.isEnabled = false
navigationItem.hidesBackButton = true
在最终屏幕上的 viewWillAppear()
中。如果您正在推动另一个视图并在那里需要它们,您可以在 viewWillDisappear()
中撤消这些操作。
对于objective-c
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:true];
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}
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)
}
}
如果您尝试了所有方法都不起作用,那么这是您错过的东西。
- 将
navigationController?.interactivePopGestureRecognizer?.isEnabled = false
添加到您的 viewWillAppear(animated:) 方法。
- 如果它不起作用,请从视图控制器中删除导航委托。再次检查您的视图控制器是否正在确认
UINavigationControllerDelegate
、UIGestureRecognizerDelegate
协议。如果是这样,请将其删除。
如果需要在某些屏幕上显示侧边菜单,则在此特定视图上添加 AddScreenEdgePanGesture 而不是 navigationController 视图
替换它
SideMenuManager.default.menuAddScreenEdgePanGesturesToPresent(toView: self.navigationController?.view)
有了这个
SideMenuManager.default.menuAddScreenEdgePanGesturesToPresent(toView: self.view)
在将视图控制器推送到导航控制器之前添加此行
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
而不是
self.navigationController.pushViewController(VC, animated: Bool)
通话
self.navigationController.setViewContollers([VC], animated: Bool)
setViewControllers
替换堆栈中的所有VC,而不是添加一个新控制器在上面。这意味着新集合VC是根VC,用户无法返回
当您只想禁用单个 VC 上的滑动并为另一个 VC 保持向后滑动时,这是最有效的。
如果您希望用户能够返回,而不是通过滑动,请不要使用此方法,因为它会禁用所有返回(因为没有 VC 可以返回)。
如果您不关心系统后退按钮的外观(例如,如果您使用自定义后退按钮或导航栏完全隐藏),它可能对您有所帮助:
navigationItem.hidesBackButton = true
隐藏后退按钮并禁用向后滑动手势。
只有完全删除手势识别器对我有用(从呈现视图控制器)。
if let navigationController = parent.navigationController,
let interactivePopGestureRecognizer = navigationController.interactivePopGestureRecognizer {
navigationController.view.removeGestureRecognizer(interactivePopGestureRecognizer)
}
如果你不想回来,或者你设置了新的 rootViewController,请不要使用这个。
self.navigationController.pushViewController(VC, animated: Bool)
使用这个
self.navigationController.setViewContollers([VC], animated: Bool)
setViewControllers 删除堆栈中的所有视图控制器,然后用户无法返回。它将禁用所有后背
来晚了一点。在我的情况下 self.navigationController?.navigationItem.backBarButtonItem?.isEnabled = false;
不工作。所以我这样做:你可以呈现视图控制器而不是推送视图控制器。这样,向后滑动手势将不会应用于视图控制器。
navigationController?.present(vc, animated: true)
您可以为自定义后退按钮使用关闭
self.dismiss(animated: true)
注意:您可以在呈现它之前设置 VC 模式呈现样式以确保它是全屏的。
vc.modalPresentationStyle = .fullScreen
希望对您有所帮助。
在这里四处寻找了一段时间,但似乎找不到可行的解决方案。
我试图在 Swift 中禁用滑动以返回上一个视图手势。
我尝试了多种解决方案,包括:
self.navigationController?.interactivePopGestureRecognizer.enabled = false
和
self.navigationController.interactivePopGestureRecognizer.delegate = self
func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer!) -> Bool {
return false
}
是否有新方法或其他有效方法?
您可以禁用它,但不建议这样做,因为大多数 iOS 用户通过滑动返回,而不是通过按下后退按钮返回。
如果你想禁用它,使用 modal segue
代替不是那么大的传输的推送 segue 会更合理。
如果你真的想摆脱滑动返回功能,我会禁用后退按钮并在屏幕右上角有一个完成按钮。
self.navigationController?.navigationItem.backBarButtonItem?.isEnabled = false;
我能够通过在 gestureRecognizerShouldBegin 中返回 false 来做到这一点
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
}
Hari 或 Stefan 的回答都没有错,但更简洁。只需将其放入 viewDidLoad 即可。
if navigationController!.respondsToSelector(Selector("interactivePopGestureRecognizer")) {
navigationController!.view.removeGestureRecognizer(navigationController!.interactivePopGestureRecognizer)
}
编辑:
一个小警告是,如果导航控制器被另一个视图打开并且导航控制器关闭,那么您将收到 EXC_BAD_ACCESS 错误。要修复它,您必须保存原始的 UIGestureRecognizer 并在退出视图时将其放回原处。
声明:
private var popGesture: UIGestureRecognizer?
在删除手势之前:
popGesture = navigationController!.interactivePopGestureRecognizer
然后关闭视图时:
If popGesture != nil {
navigationController!.view.addGestureRecognizer(popGesture!)
}
以下是禁用和重新启用向后滑动的简单方法。
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
Swift 版本 2.x 及以下:
navigationController?.interactivePopGestureRecognizer?.enabled
Objective-C:
self.navigationController.interactivePopGestureRecognizer.enabled
我通常会确保在尽可能多的地方启用向后滑动,甚至添加自定义手势识别器以将其添加到模态屏幕。但是,对于我的应用程序中的身份验证和下载过程,我使用模态导航控制器启动该过程,然后为每个下一步推送视图。但是,一旦完成,我想阻止他们备份到身份验证屏幕。
对于这个场景,我一直在使用:
navigationController?.interactivePopGestureRecognizer?.isEnabled = false
navigationItem.hidesBackButton = true
在最终屏幕上的 viewWillAppear()
中。如果您正在推动另一个视图并在那里需要它们,您可以在 viewWillDisappear()
中撤消这些操作。
对于objective-c
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:true];
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}
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)
}
}
如果您尝试了所有方法都不起作用,那么这是您错过的东西。
- 将
navigationController?.interactivePopGestureRecognizer?.isEnabled = false
添加到您的 viewWillAppear(animated:) 方法。 - 如果它不起作用,请从视图控制器中删除导航委托。再次检查您的视图控制器是否正在确认
UINavigationControllerDelegate
、UIGestureRecognizerDelegate
协议。如果是这样,请将其删除。
如果需要在某些屏幕上显示侧边菜单,则在此特定视图上添加 AddScreenEdgePanGesture 而不是 navigationController 视图
替换它
SideMenuManager.default.menuAddScreenEdgePanGesturesToPresent(toView: self.navigationController?.view)
有了这个
SideMenuManager.default.menuAddScreenEdgePanGesturesToPresent(toView: self.view)
在将视图控制器推送到导航控制器之前添加此行
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
而不是
self.navigationController.pushViewController(VC, animated: Bool)
通话
self.navigationController.setViewContollers([VC], animated: Bool)
setViewControllers
替换堆栈中的所有VC,而不是添加一个新控制器在上面。这意味着新集合VC是根VC,用户无法返回
当您只想禁用单个 VC 上的滑动并为另一个 VC 保持向后滑动时,这是最有效的。
如果您希望用户能够返回,而不是通过滑动,请不要使用此方法,因为它会禁用所有返回(因为没有 VC 可以返回)。
如果您不关心系统后退按钮的外观(例如,如果您使用自定义后退按钮或导航栏完全隐藏),它可能对您有所帮助:
navigationItem.hidesBackButton = true
隐藏后退按钮并禁用向后滑动手势。
只有完全删除手势识别器对我有用(从呈现视图控制器)。
if let navigationController = parent.navigationController,
let interactivePopGestureRecognizer = navigationController.interactivePopGestureRecognizer {
navigationController.view.removeGestureRecognizer(interactivePopGestureRecognizer)
}
如果你不想回来,或者你设置了新的 rootViewController,请不要使用这个。
self.navigationController.pushViewController(VC, animated: Bool)
使用这个
self.navigationController.setViewContollers([VC], animated: Bool)
setViewControllers 删除堆栈中的所有视图控制器,然后用户无法返回。它将禁用所有后背
来晚了一点。在我的情况下 self.navigationController?.navigationItem.backBarButtonItem?.isEnabled = false;
不工作。所以我这样做:你可以呈现视图控制器而不是推送视图控制器。这样,向后滑动手势将不会应用于视图控制器。
navigationController?.present(vc, animated: true)
您可以为自定义后退按钮使用关闭
self.dismiss(animated: true)
注意:您可以在呈现它之前设置 VC 模式呈现样式以确保它是全屏的。
vc.modalPresentationStyle = .fullScreen
希望对您有所帮助。