隐藏和显示导航栏时,导航栏后退按钮消失

时间:2018-12-19 14:04:46

标签: ios swift uinavigationcontroller

我正在尝试重新创建类似于Apple News应用程序中针对UINavigationController看到的行为。
我有两个控制器A和B,A嵌入在UINavigationController中,并且与B相连。
A中的导航栏是隐藏的,而B中的导航栏是可见的,并且从一个导航栏移动到另一个导航栏时,动画会正确设置。

要实现此目的,我将A设置为UINavigationController的委托,并添加

func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationController.Operation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
    if operation == .push {
        navigationController.setNavigationBarHidden(false, animated: false)
    }
    return nil
}

func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
    if let coordinator = navigationController.topViewController?.transitionCoordinator {
        if let _ = viewController as? ViewControllerA {
           navigationController.setNavigationBarHidden(true, animated: false)
        }

        coordinator.notifyWhenInteractionChanges { (context) in
            if context.isCancelled == true {
                navigationController.setNavigationBarHidden(false, animated: false)
            }
        }
    }
}

我遇到的问题是向后滑动手势。
当手势开始时,我将隐藏导航栏,以使其在ViewControllerA上不可见,但是如果取消手势,我将再次显示该栏。
不幸的是,再次显示它时,虽然条本身是可见的,但由于某些原因后退按钮却没有出现。
你知道那是为什么吗?

An example of the issue

1 个答案:

答案 0 :(得分:3)

在这种情况下,我认为您不必使用导航控制器委托,而只需在视图控制器的viewWillAppear方法中显示/隐藏导航栏:

class ViewControllerA: UIViewController {

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.setNavigationBarHidden(true, animated: animated)
    }

}

class ViewControllerB: UIViewController {

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.setNavigationBarHidden(false, animated: animated)
    }

}

我认为这是较简单的解决方案,不会因缺少后退按钮而造成任何问题。 :)