导航栏显示/隐藏

Posted

技术标签:

【中文标题】导航栏显示/隐藏【英文标题】:Navigation bar show/hide 【发布时间】:2011-02-24 23:54:29 【问题描述】:

我有一个应用程序,其导航栏由 2 个栏按钮组成。我想在用户双击屏幕时隐藏并显示此导航栏。

最初,导航栏应该是隐藏的。当用户双击屏幕时,导航栏应该会出现一个动画,就像在 iPhone 的照片库中可以看到的那样。

我该怎么做呢?建议总是受到赞赏。

【问题讨论】:

【参考方案1】:

这不是几行代码就能完成的事情,但这是一种可能适合您的方法。

隐藏导航栏:

[[self navigationController] setNavigationBarHidden:YES animated:YES];

展示它:

[[self navigationController] setNavigationBarHidden:NO animated:YES];

此方法的文档是available here。

要监听“双击”或双击,子类 UIView 并将该子类的实例作为视图控制器的 view 属性。

在视图子类中,覆盖其-touchesEnded:withEvent: 方法,并通过测量两次连续点击之间的时间(可能使用CACurrentMediaTime())来计算您在一段时间内获得的触摸次数。或者测试[touch tapCount]的结果。

如果您点击两次,您的子类视图会发出一个 NSNotification,您的视图控制器已注册监听。

当您的视图控制器听到通知时,它会触发一个选择器,该选择器使用上述代码隐藏或显示导航栏,具体取决于导航栏的当前可见状态,可通过读取导航栏的 isHidden 属性访问。

编辑

我处理点击事件的部分答案可能在 ios 3.1 之前很有用。如今,UIGestureRecognizer 类可能是处理双击的更好方法。

编辑 2

隐藏导航栏的Swift方式是:

navigationController?.setNavigationBarHidden(true, animated: true)

展示它:

navigationController?.setNavigationBarHidden(false, animated: true)

【讨论】:

如果这是用于照片查看器应用程序,隐藏导航栏会导致图像视图出现令人不快的跳转,我还没有找到如何防止的方法。 3.2 允许您使用 UIGestureRecognizer 进行双击,这是一种更简洁的方法(仅适用于 iPad atm)。 非常感谢亚历克斯,你为我提供了很多信息,我会遵循你的指导方针......非常感谢 这同样适用于标签栏吗???如果我想隐藏/显示标签栏,我该怎么办?关于shishir 有什么方法可以防止保罗提到的这种“跳跃”吗?我有同样的问题,我不知道是什么原因造成的......我也不认为,没有人偶然发现它。 要阻止“跳转”的发生,您必须在隐藏/显示导航栏后重置滚动视图的 contentInset 属性,正如 jclee 提到的那样。 IE。 self.scrollView.contentInset = UIEdgeInsetsZero【参考方案2】:

此代码将帮助您。

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] 
initWithTarget:self action:@selector(showHideNavbar:)];
[self.view addGestureRecognizer:tapGesture];

-(void) showHideNavbar:(id) sender 
 
// write code to show/hide nav bar here 
// check if the Navigation Bar is shown
if (self.navigationController.navigationBar.hidden == NO)

// hide the Navigation Bar
[self.navigationController setNavigationBarHidden:YES animated:YES];

// if Navigation Bar is already hidden
else if (self.navigationController.navigationBar.hidden == YES)

// Show the Navigation Bar
[self.navigationController setNavigationBarHidden:NO animated:YES];


【讨论】:

【参考方案3】:

首先阅读 iOS 视图控制器编程指南中关于“为导航视图采用全屏布局”的部分以及关于自定义视图的相同部分。如果您尝试执行 Photos.app 之类的操作,那么您可能正在使用滚动视图。请注意导航栏会自动将滚动内容插图添加到滚动视图以考虑导航栏(和状态栏)的高度的注释,因此您必须立即将滚动视图的 contentInset 属性重置为零(UIEdgeInsetsZero)在视图出现之前设置导航栏的初始状态。

然后,如果您单击一下即可切换导航栏和/或状态栏以显示或隐藏,您需要在切换方法中做两件事。第一个似乎是在更改 NavigationBar 隐藏属性之前保存滚动视图的 contentOffset 属性,然后立即将保存的值恢复为 contentOffset。在更改 navigationBarHidden 属性后,再次将 contentInset 属性归零为 UIEdgeInsetsZero。此外,如果您要切换状态栏,则需要先更改其状态,然后再更改导航栏的状态。

【讨论】:

非常感谢您提供 contentOffset 和 contentInset 注释。你才是真正的英雄。 我同意,你是真正的英雄,在这里!非常感谢。【参考方案4】:

Swift 中试试这个,

navigationController?.isNavigationBarHidden = true  //Hide
navigationController?.isNavigationBarHidden = false //Show

navigationController?.setNavigationBarHidden(true, animated: true) //Hide
navigationController?.setNavigationBarHidden(false, animated: true) //Show

【讨论】:

【参考方案5】:

隐藏导航栏:

[self.navigationController setNavigationBarHidden:YES animated:YES];

显示导航栏:

[self.navigationController setNavigationBarHidden:NO animated:YES];

【讨论】:

在 iOS 7 中,自动完成实际上促进了这种解决方案,而不是最高投票的解决方案。【参考方案6】:

这是一个非常快速和简单的解决方案:

self.navigationController.hidesBarsOnTap = YES;

这将在单击而不是双击时起作用。即使在推送或弹出当前视图控制器之后,它也会改变导航控制器的行为。

如果您只想为单个视图控制器设置行为,您始终可以在 viewWillAppear: 和 viewWillDisappear: 操作中修改控制器中的此行为。

这里是documentation:

【讨论】:

【参考方案7】:

一种方法是取消选中属性检查器中的栏可见性“显示导航栏”。希望这对某人有所帮助。

【讨论】:

【参考方案8】:

在 Swift 4.2 和 Xcode 10 中

self.navigationController?.isNavigationBarHidden = true  //Hide
self.navigationController?.isNavigationBarHidden = false  //Show

如果您不想仅在第一个 VC 中显示导航栏,但您希望在第二个 VC onword 中显示

在您的第一个 VC 中编写此代码。

override func viewWillAppear(_ animated: Bool) 
    self.navigationController?.isNavigationBarHidden = true  //Hide


override func viewWillDisappear(_ animated: Bool) 
    self.navigationController?.isNavigationBarHidden = false  //Show

【讨论】:

【参考方案9】:

如果你想检测导航栏的状态是不是 隐藏/显示。您可以简单地使用以下代码来检测 -

if self.navigationController?.isNavigationBarHidden
    print("Show navigation bar")
 else 
    print("hide navigation bar")

【讨论】:

【参考方案10】:

UINavigationController 属性上的hidesBarsOnTap 使用 iOS8 SDK 来处理这个问题

https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UINavigationController_Class/#//apple_ref/occ/instp/UINavigationController/hidesBarsOnTap

【讨论】:

【参考方案11】:

SWIFT 代码:这完全适用于 iOS 3.2 及更高版本。

  override func viewDidAppear(animated: Bool) 
    super.viewDidAppear(animated)

    let tapGesture = UITapGestureRecognizer(target: self, action: "hideNavBarOntap")let tapGesture = UITapGestureRecognizer(target: self, action: "hideNavBarOntap")
    tapGesture.delegate = self
    self.view.addGestureRecognizer(tapGesture)

然后写

func hideNavBarOntap() 
    if(self.navigationController?.navigationBar.hidden == false) 
        self.navigationController?.setNavigationBarHidden(true, animated: true) // hide nav bar is not hidden
     else if(self.navigationController?.navigationBar.hidden == true) 
        self.navigationController?.setNavigationBarHidden(false, animated: true) // show nav bar
    

【讨论】:

我认为这是一个糟糕的解决方案,如果没有正确配置,添加轻击手势可以删除其他视图(如 UITableView 或 UICollectionView)上的手势。检查 boolean == true 是否是多余的,可能会导致其他程序员认为这是一个好习惯。在您的示例中,您还滥用了驼峰式大小写并缺少一个端括号。请记住,因为 swift 2.2 选择器也已更新。最后 swift 只支持 iOS 7 及以上版本,绝对不会在 iOS 3.2 上运行

以上是关于导航栏显示/隐藏的主要内容,如果未能解决你的问题,请参考以下文章

导航栏状态,显示和隐藏底部导航栏

隐藏导航栏、显示导航栏

导航栏显示/隐藏

在导航栏折叠时隐藏的导航栏中显示图像

iOS解决隐藏导航栏后,打开照片选择器后导航栏不显示的问题以及更换导航栏背景色

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