I have view controllers in a navigation controller (root: RootViewController
, second: ReadingViewController
), but in the second view controller I want to disable the navigation bar for a UIToolBar
(as I don't need the title and want more buttons, like in iBooks or the Facebook app). Problem is, when I hide the navigation bar in the second view, it appears randomly for a second again when I pop the view controller (go back).
When I pop the view controller the back button appears for a second:
In the second view controller I hide the nav bar in viewWillAppear:
:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
Also in the second view controller, I restore the nav bar in viewWillDisappear:
:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
// ... other stuff
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
I'm wondering how I combat this issue so that the view controllers transition seamlessly.
Answer 1:
嘿,你为什么不使用导航栏作为一个UIToolbar
。
而不是躲在UINavigation
你可以模仿导航控制器UITootlbar
通过添加按钮到它。
隐藏取消隐藏UINavigation
将是复杂的。
我上传的Dropbox的链接 。
Answer 2:
这里的问题是, viewDidLoad
是的太快! 请记住, viewDidLoad
没有任何与界面和实际推动动画。 这并不意味着,这个视图控制器的观点是即将出现在屏幕上! 它只是意味着视图控制器已获得其视图。
我做了一个视频,显示在我的机器上会发生什么,因为我来回移动两种查看控制器之间的导航界面,其中一个显示在导航栏上,其他没有: http://youtu.be/PxpchytWQ4A
对我来说,作为你要显示和隐藏的导航栏,你push和pop时得到的相干! 下面是我使用的代码。 隐藏其导航栏视图控制器是类ViewController2的。 此代码是在应用程序委托:
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
dispatch_async(dispatch_get_main_queue(), ^{
[(UINavigationController*)self.window.rootViewController setDelegate:self];
});
return YES;
}
-(void)navigationController:(UINavigationController *)nc
willShowViewController:(UIViewController *)vc
animated:(BOOL)animated
{
[nc setNavigationBarHidden:([vc isKindOfClass:[ViewController2 class]])
animated:animated];
}
这就是我所做的。
Answer 3:
在第二视图控制器隐藏在viewWillAppear中的导航栏::
self.navigationController.navigationBar.frame = CGRectMake(0, 0, 0, 0);
对于取消隐藏导航栏设置的帧中viewWillDisappear:
self.navigationController.navigationBar.frame = CGRectMake(0, 0, 320, 44);
Answer 4:
嗯,我从你的问题,了解目前的做法的唯一的问题是原有的“后退”按钮临时出现。 那么,为什么不只是阻止此按钮视图控制器?
self.navigationItem.hidesBackButton = YES;
我想这可能会有帮助。 但是,对于你的主要任务,我宁愿建议您使用自定义导航栏与作为要添加尽可能多的按钮能力。 这种方法是针对iOS更自然,就像你在你的问题中提到你可能永远面临的问题。
Answer 5:
你好下面的东西,完成了我的工作
在FirstViewController
把这个方法
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
在SecondViewController
把这个方法
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
我没有用viewWillDisappear
所做我的工作。
希望能帮助你。
Answer 6:
这可能是从移动你的代码一样简单viewWillDisappear
到viewDidDisappear
。
此外,避免使用动画在任何视图*出现的方法,作为视图的过渡已经被动画。
Answer 7:
我的问题是,当我推的viewController用的导航栏到一个没有它通过使用一个定制的过渡从左侧移动它,我不能够有它跟随第二视图控制器的帧。 它总是从上产生非常不愉快的影响,每当我执行此操作下降。
Answer 8:
您可以显示导航栏,这使得它出现在你的父视图控制器,然后从0到1的转变阿尔法:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
self.navigationController.navigationBar.hidden = NO;
self.navigationController.navigationBar.alpha = 0;
[UIView animateWithDuration:0.3 animations:^{
self.navigationController.navigationBar.alpha = 1;
}];
}
文章来源: Hide navigation bar, but when I transition to the previous view (popped) it shows the old back button temporarily. Why?