导航栏显示/隐藏


158

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

最初,导航栏应被隐藏。当用户双击屏幕时,导航栏应该带有动画,就像在iPhone的相册中可以看到的那样。

我该怎么做?建议总是很感激。

Answers:


381

这不是适合几行代码的内容,但这是一种可能对您有用的方法。

隐藏导航栏:

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

要显示它:

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

有关此方法的文档,请参见此处

要侦听“双击”或双击,请子类化UIView并创建该子类的实例作为视图控制器的view属性。

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

如果两次轻按,则子类视图将发出一个NSNotification视图控制器已注册以监听的视图。

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

编辑

我的答案中有关处理点击事件的部分可能在iOS 3.1之前有用。该UIGestureRecognizer班可能是用于处理双水龙头,这几天的更好方法。

编辑2

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

navigationController?.setNavigationBarHidden(true, animated: true)

要显示它:

navigationController?.setNavigationBarHidden(false, animated: true)

如果这是用于照片查看器应用程序,则隐藏导航栏会导致图像视图出现不愉快的跳转,但我尚未找到如何防止的方法。3.2允许您使用UIGestureRecognizer进行双击,这是一种更为整洁的方法(仅适用于iPad atm)。
保罗·林奇

非常感谢Alex,您向我提供了很多信息,我将遵循您的指南..非常感谢
Shishir.bobby 2010年

标签栏是否也一样???如果我要隐藏/显示选项卡栏我要做什么?问候shishir
Shishir.bobby,2010年

1
有什么办法可以防止保罗提到的这种“跳跃”?我有同样的问题,但我不知道是什么原因造成的。
Icky 2010年

要停止发生“跳转”,您必须在隐藏/显示导航栏后重置jclee提到的scrollview的contentInset属性。即。self.scrollView.contentInset = UIEdgeInsetsZero
手工艺品2012年

17

此代码将为您提供帮助。

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

16

首先,阅读iOS的《 View Controller编程指南》中有关“为导航视图采用全屏布局”的部分以及有关“自定义视图”的相关部分。如果您尝试执行类似Photos.app的操作,则可能正在使用滚动视图。请注意,导航栏会自动向滚动视图添加滚动内容插图,以说明导航栏(和状态栏)的高度,因此您必须在紧随其后将滚动视图的contentInset属性重置回零(UIEdgeInsetsZero)设置navigationBar的初始状态并在视图出现之前。

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


1
非常感谢您的contentOffset和contentInset注意。你是真正的英雄。
Altealice

我同意,您是真正的英雄,在这里!非常感谢。
加丹

9

Swift中试试这个,

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

要么

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

7

隐藏导航栏:

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

要显示导航栏:

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

在iOS 7中,自动完成实际上是在推广该解决方案,而不是票数最高的解决方案。
Alex Zavatone 2014年

7

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

self.navigationController.hidesBarsOnTap = YES;

这将适用于单击而不是双击。同样,即使按下或弹出当前视图控制器,它也会改变导航控制器的行为。

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

这是文档



2

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

2

如果要检测导航栏的状态,则将其隐藏/显示。您只需使用以下代码即可检测到-

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


-4

SWIFT CODE:此代码完全适用于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
    }
}

1
我认为这是一个糟糕的解决方案,如果未正确配置,添加轻击手势可以删除其他视图(如UITableView或UICollectionView)上的手势。同样检查是否布尔值== true是多余的,并且可能导致其他程序员认为这是一种好习惯。您还滥用了骆驼的情况,并在示例中缺少结尾括号。请记住,因为Swift 2.2选择器也已更新。最后,只有iOS 7和更高版本才支持swift,并且绝对不会在iOS 3.2上运行
David Rees
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.