隐藏导航栏,取决于视图控制器的显示方式

Posted

技术标签:

【中文标题】隐藏导航栏,取决于视图控制器的显示方式【英文标题】:Set navigation bar hidden, depending on how the view controller appeared 【发布时间】:2011-08-18 12:35:13 【问题描述】:

我在其中一个选项卡中有一个带有导航控制器的选项卡栏。目前,导航控制器的根视图没有显示导航栏,并且通过

很好地动画到子视图中
- (void)viewDidLoad 
   ...
   [self.navigationController setNavigationBarHidden:YES animated:NO];
   ...

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


- (void)viewWillDisappear:(BOOL)animated 
    [self.navigationController setNavigationBarHidden:NO animated:YES];

当然,更改选项卡会启动 viewWillAppear 功能,因此当我返回根视图时,导航栏会滑开,而不是不存在。

有没有一种方法可以隐藏根视图上的导航栏而不对其进行动画处理,除非从导航堆栈上的子视图中出现?

【问题讨论】:

【参考方案1】:

viewWillAppear:animated 上的 (BOOL)animated 参数。更改选项卡时,它将以NO 出现,因为动画是即时的。另一方面,如果它被animated:YES从导航堆栈推送弹出,那么它将以YES出现。

虽然这看起来像一个 hack,但它是正确的方法:你不需要弄清楚谁是调用者,相反,专注于这样一个事实:如果你的视图控制器会显示动画,你有时间做你自己的动画,如果没有,就把它搞砸,立即显示(或者在这种情况下,隐藏)一切。

【讨论】:

这似乎有点容易破解。如果选项卡切换行为发生变化怎么办?怎么样 - (void)viewWillAppear:(BOOL)animated [self.navigationController setNavigationBarHidden:(self.navigationController.viewControllers.count>1) animated:YES]; @MihaiTimar 感谢您的评论。是的,这是一种确定谁是呼叫者的方法,我鼓励您用它来创建对原始问题的新回复。我的回答更侧重于 animated:(BOOL) 作为“我有时间做自己的动画吗?”更有用的事实。而不是试图弄清楚视图是如何出现的。我更新了我的答案以确保它清楚。【参考方案2】:

尝试在 UINavigationController 的委托的 navigationController:willShowViewController:animated: 方法中显示/隐藏栏,具体取决于显示的视图控制器是否是您的根视图控制器。

【讨论】:

【参考方案3】:

如果您在应用程序委托中设置一个布尔变量,并在子视图中将该布尔变量设置为 0,而在其他视图中设置为 1,会怎样。并且在您的视图中将出现,根据您的变量的值,您可以设置动画。

【讨论】:

原来动画布尔变量已经解决了这个问题。不过谢谢。

以上是关于隐藏导航栏,取决于视图控制器的显示方式的主要内容,如果未能解决你的问题,请参考以下文章

搜索显示控制器如何隐藏导航栏?

在一个视图控制器上隐藏导航栏,在推送的控制器上显示它

导航栏在第二次和后续出现时隐藏在视图控制器上

iOS:在导航栏中显示搜索栏时隐藏范围栏

SWRevealViewController 隐藏我的前视图控制器的导航栏

导航栏隐藏在 iPhone sdk 的弹出视图控制器上