导航栏显示/隐藏

时间:2010-05-28 05:55:57

标签: iphone ios uinavigationcontroller uinavigationbar

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

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

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

11 个答案:

答案 0 :(得分:363)

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

隐藏导航栏:

[[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方式是:

self.navigationController?.setNavigationBarHidden(true, animated: true)

要表明:

self.navigationController?.setNavigationBarHidden(false, animated: true)

答案 1 :(得分: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];
}
}

答案 2 :(得分:16)

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

然后,如果您只需点击一下切换导航栏和/或状态栏以显示或隐藏,您需要在切换方法中执行两项操作。第一个似乎是在更改NavigationBar隐藏属性之前保存滚动视图的contentOffset属性,然后将保存的值恢复到contentOffset。第二,在更改navigationBarHidden属性后,再次将contentInset属性清零为UIEdgeInsetsZero。此外,如果要切换状态栏,则需要在更改navigationBar状态之前更改其状态。

答案 3 :(得分:9)

Swift 试试这个,

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

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

答案 4 :(得分:7)

隐藏导航栏:

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

显示导航栏:

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

答案 5 :(得分:7)

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

self.navigationController.hidesBarsOnTap = YES;

这将适用于单击而非双击。此外,即使在按下或弹出当前视图控制器后,它也会更改导航控制器的行为。

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

以下是documentation

答案 6 :(得分:4)

一种方法是取消选中Bar Visibility"显示导航栏"在Attribute Inspector中。希望这可以帮助某人。

enter image description here

答案 7 :(得分:2)

在Swift 4.2和Xcode 10中

#include<iostream>
#include<sstream>
#include<vector>
#include<string>
using namespace std;
int main() {
    int t;
    (cin >> t).get();
    while (t--) {
        string str;

        getline(cin, str);
        stringstream split(str);
        string each;
        vector <string> tokens;
        while (getline(split, each, ' ')) {
            ///scan each part of stream;
            tokens.push_back(each);

        }
        int ind = -1;
        for (int i = 0; i < tokens.size(); i++) {
            string temp;
            temp = tokens[i];
            for (int j = 0; j < temp.length(); j++) {
                if (temp[j] == 'm') {
                    ind = i;
                    break;
                }

            }
            if (ind != -1)
                break;
        }
        int i1, i2;
        string str1;
        if (ind == 0) {
            i1 = stoi(tokens[2]);
            i2 = stoi(tokens[4]);
            int result = i2 - i1;
            cout << result << " + " << i1 << " = " << i2 << "\n";
            //break;
        }
        else if (ind == 2) {
            i1 = stoi(tokens[0]);
            i2 = stoi(tokens[4]);
            int result;
            result = i2 - i1;
            cout << i1 << " + " << result << " = " << i2 << "\n";
            //break;
        }
        else if (ind == 4) {
            i1 = stoi(tokens[0]);
            i2 = stoi(tokens[2]);
            int result = i1 + i2;
            cout << i1 << " + " << i2 << " = " << result << "\n";
            //break;
        }
        tokens.clear();
        str.erase();
    }


}

如果您不想仅在第一个VC中显示导航栏,而是要在第二个VC onword的显示中显示

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

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

答案 8 :(得分:2)

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

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

答案 9 :(得分:0)

答案 10 :(得分:-3)

SWIFT CODE:适用于iOS 3.2及更高版本。

MDI Parent

然后写

  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)