17

我在导航控制器中有视图控制器(root: RootViewController, second: ReadingViewController),但在第二个视图控制器中我想禁用导航栏UIToolBar(因为我不需要标题并且想要更多按钮,例如 iBooks 或脸书应用程序)。问题是,当我在第二个视图中隐藏导航栏时,当我弹出视图控制器(返回)时,它再次随机出现一秒钟。

当我弹出视图控制器时,后退按钮会出现一秒钟:

在此处输入图像描述

在第二个视图控制器中,我将导航栏隐藏在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];
}

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

4

8 回答 8

15

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

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

对我来说,这与您在按下和弹出时显示和隐藏导航栏一样连贯!这是我使用的代码。隐藏其导航栏的视图控制器属于 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];   
}

这就是我所做的。

于 2013-04-28T21:32:16.867 回答
2

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

UINavigation您可以UITootlbar通过向其添加按钮来模仿导航控制器,而不是隐藏。

隐藏隐藏UINavigation会很复杂。

我上传了保管箱链接

于 2013-05-20T12:15:50.633 回答
1

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

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

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

self.navigationController.navigationBar.frame = CGRectMake(0, 0, 320, 44);
于 2013-05-04T13:47:32.193 回答
1

好吧,正如我从您的问题中了解到的那样,您当前方法的唯一问题是原始“后退”按钮的临时外观。那么为什么不直接为视图控制器阻止这个按钮呢?

self.navigationItem.hidesBackButton = YES;

我认为这可能会有所帮助。但是对于您的主要任务,我宁愿建议您使用能够添加任意数量按钮的自定义导航栏。这种方法对于 iOS 来说更自然,您可能永远不会遇到您在问题中提到的问题。

于 2013-05-24T06:08:57.673 回答
0

您好以下内容完成了我的工作

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

希望能帮到你。

于 2013-05-07T10:42:18.383 回答
0

我的问题是,当我通过使用从左侧移动它的自定义转换将带有导航栏的视图控制器推到没有它的视图控制器上时,我无法让它跟随第二个视图控制器的框架。每当我执行此操作时,它总是从上方掉落,产生非常不愉快的效果。

于 2014-05-18T11:38:33.743 回答
0

就像将代码viewWillDisappearviewDidDisappear.

另外,避免在任何 view*appear 方法中使用动画,因为视图转换已经被动画化了。

于 2013-05-22T09:53:52.653 回答
0

您可以显示导航栏,使其出现在您的父视图控制器中,然后将 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;
    }];
}
于 2016-04-05T20:18:40.820 回答