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

Aar*_*ski 26 gesture uinavigationcontroller ios ios7

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

Ene*_*nso 53

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

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

在斯威夫特, 通过添加这样的扩展,可以在整个应用程序中轻松完成UINavigationController此操作:

extension UINavigationController {

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

}
Run Code Online (Sandbox Code Playgroud)

更新的答案

似乎设置委托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
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 这似乎有效,但事实证明,在某些情况下它会冻结应用程序.我认为在推送视图控制器时触发交互式弹出手势时会发生这种情况.更安全的方法是继承`UINavigationController`.在子类中,将"interactivePopGestureRecognizer.delegate"设置为self,并防止在按下新视图控制器时识别交互式pop手势. (6认同)

Aar*_*ski 26

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

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

    return YES;

}
Run Code Online (Sandbox Code Playgroud)


cro*_*ini 18

看看这个回复和评论.您所要做的就是将导航控制器的交互式pop手势识别器的委托设置为nil:

self.navigationController.interactivePopGestureRecognizer.delegate = nil;
Run Code Online (Sandbox Code Playgroud)

将它设置为已转换为self id<UIGestureRecognizerDelegate>也可以工作,因为协议中的所有方法都是可选的,但我认为nil在这种情况下将委托设置为更合适.

  • 这"工作"但不久之后导致非常奇怪的问题到冻结应用程序(使用iOS 8,设备测试) (7认同)
  • 我在viewDidAppear中只获得了成功 (2认同)

小智 12

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

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
Run Code Online (Sandbox Code Playgroud)


Kuk*_*won 10

我的答案基于 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
    }
}
Run Code Online (Sandbox Code Playgroud)


Hit*_*esh 8

如果你觉得你已经尝试了所有的解决方案并伸展你的头,那么你来对地方了。

Goto simulator > Window > Enable Show Device Bezels
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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


Doc*_*oca 6

也许有人会发现这很有帮助。

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

self.navigationController?.navigationBar.isHidden = true
Run Code Online (Sandbox Code Playgroud)

如果你想禁用导航栏(隐藏导航栏,禁用向后滑动)但想推送视图控制器,你应该使用:(isNavigationBarHidden

self.navigationController?.isNavigationBarHidden = true
Run Code Online (Sandbox Code Playgroud)

2018 年 12 月 7 日更新:

推荐方式:

如果您的第一个控制器使用隐藏的导航栏,但下一个子控制器使用导航栏,当您返回基本视图控制器时,您将看到一个黑色的过渡条代替导航栏。如果您在第一个视图控制器(父级)中使用,这将很容易修复:

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)
}
Run Code Online (Sandbox Code Playgroud)


Vic*_*has 5

更有效的答案是Aaron和lojals

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

在ViewDidload中放这行:

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
Run Code Online (Sandbox Code Playgroud)

并在课堂上写下这个功能

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES;}
Run Code Online (Sandbox Code Playgroud)