UINavigationController 仅隐藏导航栏 - 后退动画问题
Posted
技术标签:
【中文标题】UINavigationController 仅隐藏导航栏 - 后退动画问题【英文标题】:UINavigationController hide only navigationBar - Back animation issue 【发布时间】:2017-10-06 10:15:00 【问题描述】:我在UINavigationController
中有三个视图控制器。在第二个中,我需要隐藏导航栏而不是后退按钮和其他栏按钮。因此我不能使用isNavigationBarHidden = true
目前我正在按以下方式处理上述问题:
第一个视图控制器:
override func viewWillAppear(_ animated: Bool)
super.viewWillAppear(animated)
self.navigationController?.navigationBar.barTintColor = Constants.kThemeRedColor
self.navigationController?.navigationBar.tintColor = UIColor.white
self.navigationController?.navigationBar.barStyle = .black
self.navigationController?.navigationBar.isTranslucent = false
第二个viewController(只隐藏导航栏):
override func viewWillAppear(_ animated: Bool)
super.viewWillAppear(animated)
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
self.navigationController?.view.backgroundColor = UIColor.clear
这里的问题是,当我在 firstViewController 之间导航时,在很短的时间内,当第一个 viewController 分别消失和出现时,我会看到一个黑色的导航栏。我知道这是因为用 2nd viewController 编写的代码。但我没有任何其他解决方案可以做到这一点。附上截图:
第一个 viewController(应该是怎样的):
第二个视图控制器:
第一个 viewController(带有短暂的黑色导航栏):
【问题讨论】:
您的免费视图颜色是什么?导航栏下方是表格视图吗? 【参考方案1】:在First viewController
中,同样将navigationBar
的backgroundImage
和shadowImage
设置为nil
,即
class FirstVC: UIViewController
override func viewWillAppear(_ animated: Bool)
super.viewWillAppear(animated)
self.navigationController?.navigationBar.isTranslucent = true
self.navigationController?.navigationBar.setBackgroundImage(nil, for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = nil
self.navigationController?.navigationBar.barTintColor = .red
self.navigationController?.navigationBar.tintColor = UIColor.white
self.navigationController?.navigationBar.barStyle = .black
class SecondVC: UIViewController
override func viewWillAppear(_ animated: Bool)
super.viewWillAppear(animated)
self.navigationController?.navigationBar.isTranslucent = true
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.view.backgroundColor = UIColor.clear
self.navigationController?.navigationBar.shadowImage = UIImage()
【讨论】:
效果很好。谢谢。我还需要问,从 VC1 到 VC2 时,同样的事情也会发生。在很短的时间内,VC1 的导航栏在导航到 VC2 时变黑。我该如何解决这个问题? 也能正常工作。解决方案:在VC2中,设置:self.navigationController?.view.backgroundColor = Constants.kThemeRedColor【参考方案2】:您应该隐藏导航控制器的导航栏并使用 UIView 使用自定义导航栏。我想它会解决你的问题。
【讨论】:
【参考方案3】:第一个 viewController 在快速转换时会在短时间内显示黑色导航栏,因为发生导航栏转换的 UIWindow 的背景颜色。简单地说,在您的 didFinishLaunchingWithOptions: AppDelegate 方法中添加这一行
window?.backgroundColor = Constants.kThemeRedColor
你就完成了。编码愉快!
【讨论】:
以上是关于UINavigationController 仅隐藏导航栏 - 后退动画问题的主要内容,如果未能解决你的问题,请参考以下文章
带有主 UINavigationController 和详细 UINavigationController 的 UISplitViewcontroller
带有 UINavigationController 的 UITabBarController,在 hidesBottomBarWhenPushed 上隐藏 UINavigationController
在 UINavigationController 内的 UITabBarcontroller 中添加 UINavigationController?
UINavigationController 与 AppDelegate 中的 UISegmentedControl 切换 UINavigationController 的 rootviewcontr
从一个 UINavigationController 到另一个 UINavigationController (Swift iOS 9, xcode 7)