UINavigationController交互式流行手势不起作用?

时间:2013-09-22 16:52:25

标签: ios uinavigationcontroller ios7 gesture

所以我在iOS 7应用程序中构建了一个导航控制器。 titleView是可见的,以及它自己的后退按钮和导航栏。出于某种原因,交互式弹出手势(从左边缘轻扫)不起作用。什么都没发生。当我记录手势时,它不是零。为了启用此功能,我有什么特别的事吗?什么可能导致它不起作用?

10 个答案:

答案 0 :(得分:45)

我发现在使用自定义后退按钮时,交互式弹出手势会停止工作(我的看法是Apple无法预见自定义后退按钮的行为方式,因此他们会禁用手势)。

要解决此问题,如前所述,您可以将interactivePopGestureRecognizer.delegate属性设置为nil

在Swift中,可以通过添加UINavigationController的扩展名来轻松完成整个应用程序

extension UINavigationController {

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

}

更新回答

似乎将委托设置为nil会导致应用UI在某些情况下冻结(例如,当用户在导航堆栈的顶部视图控制器上向左或向右滑动时)。

由于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
    }

}

答案 1 :(得分:25)

呃,看起来我只需要设置手势委托并实现以下内容:

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

    return YES;

}

答案 2 :(得分:18)

请查看此response和评论。您所要做的就是将导航控制器的交互式流行姿势识别器代表设置为nil

self.navigationController.interactivePopGestureRecognizer.delegate = nil;

将其设置为自我转换为id<UIGestureRecognizerDelegate>也有效,因为协议中的所有方法都是可选的,但我认为在这种情况下将委托设置为nil更合适。

答案 3 :(得分:12)

您可以将此行放在 viewDidLoad 方法中。

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

答案 4 :(得分:6)

如果您觉得尝试了所有解决方案并伸了个懒腰,那么您来对地方了。

Goto simulator > Window > Enable Show Device Bezels

enter image description here

现在尝试模拟向后滑动手势。

答案 5 :(得分:5)

更有效的答案是Aaron和lojals

首先自定义导航控制器,然后将此代码放在类

在ViewDidload中输入以下行:

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

在课堂上写这个函数

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

答案 6 :(得分:4)

我的答案基于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 :(得分:2)

也许有人会觉得有用。

如果您想隐藏导航栏,但要使用正常的滑动手势返回并使用其他导航控制器功能,则应使用:( navigationBar

self.navigationController?.navigationBar.isHidden = true

如果要禁用导航栏(隐藏导航栏,禁用向后滑动),但要推送ViewController,则应使用:( isNavigationBarHidden

self.navigationController?.isNavigationBarHidden = true

更新7-DEC-2018:

如果第一个控制器使用隐藏的导航栏,而下一个子控件使用导航栏,则当您返回基本视图控制器时,您会在过渡栏中看到一个黑色的栏。如果在第一个viewcontroller(father)中使用,这将很容易修复:

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

在Swift 4中,我的视图控制器中有一个UITableView,我解决了这个问题:

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

答案 9 :(得分:0)

通常向整个应用添加交互式弹出手势。

XCODE :9.0, Swift :4.0

最好在AppDelegate.swift中创建UINavigationController

  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. 在应用程序didFinishLaunchingWithOptions函数中实例化UINavigationController
nvc=UINavigationController()

// For interactive pop gesture
nvc.navigationBar.isHidden=true
nvc?.interactivePopGestureRecognizer?.delegate=self
  1. 额外的步骤,将控制器添加到应用程序didFinishLaunchingWithOptions函数中的导航控制器中
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