隐藏导航栏,但是当我转换到以前的视图(popup),它暂时显示旧的后退button。 为什么?

我有一个导航控制器中的视图控制器(根: RootViewController ,第二个: ReadingViewController ),但在第二个视图控制器我想禁用UIToolBar的导航栏(因为我不需要标题,并希望更多的button,如iBooks或Facebook应用程序)。 问题是,当我在第二个视图中隐藏导航栏时,当我popup视图控制器时,它会随机出现一秒钟(返回)。

当我popup视图控制器后面的button出现一秒钟:

在这里输入图像说明

在第二个视图控制器中,我隐藏在viewWillAppear:的导航栏:

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController setNavigationBarHidden:YES animated:YES]; } 

另外在第二个视图控制器中,我将viewWillDisappear:的导航栏恢复为::

 - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; // ... other stuff [self.navigationController setNavigationBarHidden:NO animated:YES]; } 

我想知道如何解决这个问题,使视图控制器无缝过渡。

嘿,你为什么不使用导航栏作为UIToolbar

而不是隐藏UINavigation你可以通过添加button来模仿导航控制器到UITootlbar

隐藏取消隐藏UINavigation将是复杂的。

我上传了Dropbox 链接 。

这里的问题是viewDidLoad太快了! 请记住, viewDidLoad界面和实际的推动animation没有任何关系。 这并不意味着这个视图控制器的视图即将出现在屏幕上! 它仅仅意味着视图控制器已经获得了它的视图。

我做了一个video,展示了当我在导航界面中的两个视图控制器之间来回移动时,我的机器上发生了什么,其中一个显示导航栏,另一个不显示导航栏:http: //youtu.be/PxpchytWQ4A

对我来说,就像您在推送和popup窗口时显示和隐藏导航栏一样,这是一致的。 这是我使用的代码。 隐藏其导航栏的视图控制器是类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]; } 

这就是我所做的一切。

在第二个视图控制器隐藏导航栏在viewWillAppear ::

 self.navigationController.navigationBar.frame = CGRectMake(0, 0, 0, 0); 

要取消隐藏导航栏,请在viewWillDisappear中设置框架:

 self.navigationController.navigationBar.frame = CGRectMake(0, 0, 320, 44); 

那么,正如我从你的问题所理解的,你目前的做法唯一的问题是暂时出现原来的“后退”button。 那么为什么不阻止视图控制器的这个button?

self.navigationItem.hidesBackButton = YES;

我认为这可能有帮助。 但是,对于您的主要任务,我宁愿build议您使用自定义导航栏的function添加任意数量的button,只要你想。 这种方法对于iOS来说更为自然,你可能永远都不会面对你提到的问题。

你好以下的东西做了我的工作

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来完成我的工作。

希望会帮助你。

它可以像将代码从viewWillDisappear移动到viewDidDisappear一样简单。

另外,避免在任何视图中使用animation*显示方法,因为视图转换已经被animation化了。

我的问题是,当我推动一个带导航条的视图控制器到没有它的一个使用自定义的过渡从左侧移动它,我不能让它跟随第二个视图控制器的框架。 每当我做这个动作的时候,总会从上面产生一个非常不愉快的效果。

您可以显示导航栏,使其出现在父视图控制器中,然后将alpha从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; }]; }