下面的代码隐藏并显示了导航栏。它在第一个视图加载时被隐藏,然后在“子”被调用时被隐藏。问题是,当他们回到根视图....时,我找不到触发它再次隐藏的事件/动作
我在根页面上有一个“测试”按钮,手动执行操作,但它并不漂亮,我希望它是自动的。
-(void)hideBar
{
self.navController.navigationBarHidden = YES;
}
-(void)showBar
{
self.navController.navigationBarHidden = NO;
}
通过在你的ViewController中实现这个代码,你可以得到这个效果
实际上窍门是,当控制器被启动时隐藏navigationBar
- (void)viewWillAppear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:YES animated:YES];
[super viewWillAppear:animated];
}
并在用户离开该页面时取消隐藏导航栏,这是viewWillDisappear
- (void)viewWillDisappear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:NO animated:YES];
[super viewWillDisappear:animated];
}
通过在你的ViewController中实现这个代码,你可以得到这个效果
实际上窍门是,当控制器被启动时隐藏navigationBar
- (void)viewWillAppear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:YES animated:YES];
[super viewWillAppear:animated];
}
并在用户离开该页面时取消隐藏导航栏,这是viewWillDisappear
- (void)viewWillDisappear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:NO animated:YES];
[super viewWillDisappear:animated];
}
如果有人仍然对@fabb在接受的答案中评论的快速反滑取消错误有问题。
我设法通过覆盖viewDidLayoutSubviews来修复这个问题,除了viewWillAppear/viewWillDisappear,如下所示:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.setNavigationBarHidden(false, animated: animated)
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
self.navigationController?.setNavigationBarHidden(true, animated: animated)
}
//*** This is required to fix navigation bar forever disappear on fast backswipe bug.
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.navigationController?.setNavigationBarHidden(false, animated: false)
}
在我的例子中,我注意到这是因为根视图控制器(其中nav是隐藏的)和被推的视图控制器(nav是显示的)有不同的状态栏风格(例如暗和亮)。当你开始向后滑动以弹出视图控制器时,会有额外的状态栏颜色动画。如果你为了取消交互式弹出而松开手指,而状态栏动画还没有完成,导航栏就永远消失了!
但是,如果两个视图控制器的状态栏样式相同,则不会出现此错误。