我正在尝试重新创建类似于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上不可见,但是如果取消手势,我将再次显示该栏。
不幸的是,再次显示它时,虽然条本身是可见的,但由于某些原因后退按钮却没有出现。
你知道那是为什么吗?
答案 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)
}
}
我认为这是较简单的解决方案,不会因缺少后退按钮而造成任何问题。 :)