隐藏导航栏,但是当我转移到一个视图(弹出),它暂时显示旧后退按钮。 为什么?(Hide navi

2019-09-01 08:03发布

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:

这可能是从移动你的代码一样简单viewWillDisappearviewDidDisappear

此外,避免使用动画在任何视图*出现的方法,作为视图的过渡已经被动画。



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?