禁用Swift中的滑动后退手势

时间:2015-07-30 18:48:09

标签: ios swift uinavigationcontroller

在这里看了一会儿,但似乎无法找到合适的解决方案。

我试图在Swift中禁用滑动以返回上一个视图手势。

我尝试了各种解决方案,包括:

self.navigationController?.interactivePopGestureRecognizer.enabled = false

self.navigationController.interactivePopGestureRecognizer.delegate = self

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

是否有新方法可以执行此操作或其他方法有效?

12 个答案:

答案 0 :(得分:116)

以下是一种简单的禁用方法。重新启用滑动。

Swift 3.x&向上

在viewDidLoad / willAppear / didAppear方法中添加:

navigationController?.interactivePopGestureRecognizer?.isEnabled = false

请记住,如果您使用viewDidLoad执行此操作,则下次打开视图时,可能无法根据它是否保留在堆栈中进行设置。

除非您希望它保持关闭状态,否则当视图通过willMove(toParentViewController:)willDisappear关闭时,您需要将其重新打开。 <{1}} navigationController将为viewDidDisappear,因此为时已晚。

navigationController?.interactivePopGestureRecognizer?.isEnabled = true

关于 SplitViewControllers 的特别说明:

正如CompC在评论中指出的那样,您需要调用第二个导航控制器将其应用于详细视图:

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

Swift 2.2&amp;目标C

Swift版本2.x&amp;下面:

navigationController?.interactivePopGestureRecognizer?.enabled

目标-C:

self.navigationController.interactivePopGestureRecognizer.enabled

答案 1 :(得分:18)

我能够通过在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
}

答案 2 :(得分:12)

您可以禁用它,但不建议这样做,因为大多数iOS用户通过滑动返回,而按后退按钮则更少。 如果你想禁用它,那么使用modal segue而不是推送segue更为合理,而推送segue并不是那么大的转移。 如果你真的想摆脱滑动返回功能,我只需要禁用后退按钮并在屏幕右上方有一个完成按钮。

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

答案 3 :(得分:6)

在将视图控制器推到导航控制器之前添加此行

self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false

答案 4 :(得分:5)

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!)
}

答案 5 :(得分:3)

for objective -c

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

  self.navigationController.interactivePopGestureRecognizer.enabled = NO;

}

答案 6 :(得分:2)

我通常会确保在尽可能多的地方启用向后滑动,甚至添加自定义手势识别器以将其添加到模态屏幕。但是,对于我的应用程序中的身份验证和下载过程,我使用模态导航控制器启动该过程,然后推送每个下一步的视图。但是,一旦完成,我想阻止它们备份到身份验证屏幕。

对于这种情况,我一直在使用:

navigationController?.interactivePopGestureRecognizer?.isEnabled = false
navigationItem.hidesBackButton = true
最后一个屏幕上的viewWillAppear()中的

。如果您要推送另一个视图并在那里需要它们,可以在viewWillDisappear()中撤消这些视图。

答案 7 :(得分:2)

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 :(得分:2)

代替

self.navigationController.pushViewController(VC, animated: Bool)

打电话

self.navigationController.setViewContollers([VC], animated: Bool)

setViewControllers 替换堆栈上的所有 VC,而不是在顶部添加一个新控制器。这意味着新设置的VC是根VC,用户无法返回。

当您只想在单个 VC 上禁用滑动并为另一个 VC 保持滑动到背面时,这是最有效的。

如果您希望用户能够返回,而不是通过滑动,请不要使用此方法,因为它会禁用所有返回(因为没有可返回的 VC)。

答案 9 :(得分:0)

如果您在尝试全部后仍无法使用,则会错过此内容。

  1. navigationController?.interactivePopGestureRecognizer?.isEnabled = false 添加到viewWillAppear(animated :)方法。
  2. 如果它不起作用,请从视图控制器中删除导航委托。再次检查您的视图控制器是否在确认UINavigationControllerDelegateUIGestureRecognizerDelegate协议。如果是这样,只需将其删除。

答案 10 :(得分:0)

如果要求在某些屏幕上显示侧边菜单,则在此特定视图(而不是navigationController视图)上添加AddScreenEdgePanGesture

替换它

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

与此

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

答案 11 :(得分:0)

如果您不关心系统后退按钮的外观(例如,如果您使用自定义后退按钮或导航栏完全隐藏),它可能对您有所帮助:

navigationItem.hidesBackButton = true

它隐藏后退按钮并禁用向后滑动手势。