导航栏显示/隐藏

我有一个应用程序与导航栏组成的2条按钮。当用户双击屏幕时,我想隐藏并显示这个导航栏。

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

我怎样才能做到这一点? 建议总是受到欢迎的。

218202 次浏览

这不是几行代码就能解决的问题,但是这是一种可能适合您的方法。

隐藏导航栏:

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

为了表达它:

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

此方法的文档是 可在此下载

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

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

如果有两次点击,子类视图就会发出一个 NSNotification,视图控制器已经注册了这个 NSNotification来监听。

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

剪辑

我对处理点击事件的部分回答可能在 iOS 3.1之前是有用的。如今,UIGestureRecognizer类可能是处理双水龙头的更好方法。

编辑2

快速隐藏导航栏的方法是:

navigationController?.setNavigationBarHidden(true, animated: true)

为了表达它:

navigationController?.setNavigationBarHidden(false, animated: true)

首先阅读 iOS 视图控制器编程指南中关于“为导航视图采用全屏布局”的部分,以及关于自定义视图的部分。如果你正在尝试做一些像 Photos.app 那样的事情,那么你可能正在使用一个滚动视图。请注意,导航栏会自动添加一个滚动内容插入到你的滚动视图中,以考虑到导航栏(和状态栏)的高度,所以你必须在设置了导航栏的初始状态之后,在视图出现之前,立即将滚动视图的 contentInset 属性重置为零(UIEdgeInsetsZero)。

然后,如果你有一个单击,切换导航栏和/或状态栏显示或隐藏,你需要做两件事情,在你的切换方法。第一种方法似乎是在更改 NavigationBar 隐藏属性之前保存滚动视图的 contentOffset 属性,然后将保存的值恢复为 contentOffset。第二次是在更改导航 BarHidden 属性后,将 contentInset 属性取零到 UIEdgeInsetsZero。此外,如果要切换状态栏,则需要在更改导航栏的状态之前更改其状态。

这个代码会帮助你。

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];
}
}

隐藏导航栏:

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

显示导航栏:

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

斯威夫特试试这个,

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

或者

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

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

self.navigationController.hidesBarsOnTap = YES;

这将工作在单点击,而不是双点击。此外,它还会改变导航控制器的行为,即使在推动或弹出当前视图控制器之后也是如此。

如果您只想为单个视图控制器设置行为,那么您总是可以在 viewWillAppear: 和 viewWillDis卖: action 中修改控制器中的这个行为。

以下是 文件:

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
}
}

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

enter image description here

在 Swift 4.2和 Xcode 10中

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

如果你不想显示导航栏只在第一个 VC,但你想显示在第二个 VC 上的

在你的第一个 VC 编写这个代码。

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


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

如果要检测导航栏的状态,请选择 隐藏/显示。您可以简单地使用以下代码来检测-

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