导航栏的隐藏问题
我们的项目页面经过UI的美化以后有的要导航栏,有的不要导航栏,有的是用h5的导航栏,一直以来简单的做法都是在viewWillappear里面把导航栏hidden为Yes,WillDisapper里面把hidden为No,但是我发现事情没有那么简单。(但是好像安卓的导航栏很简单啊,感觉他们的改起来很随意)。
本来假如是我设计苹果的导航栏,就应该和button一样,想什么时候隐藏什么时候隐藏,想咋用咋用,但其实导航栏用法限制极多,还和手势返回,页面堆栈有大大的关系,那么我们今天讨论导航栏隐藏问题的开始,不如先从导航栏是什么开始。
导航栏是啥
首先我经常有一种错觉(我说的是我自己),就是导航栏是一个控件。因为经常要封装它或者怎么样的,以至于我们忘了导航栏其实是UINavgationController。是的,它是一个控制器,苹果的开发文档上面是这么介绍它的
导航栏 is A container view controller that defines a stack-based scheme for navigating hierarchical content.
翻译过来呢,就是导航栏是一个容器视图控制器,用于定义用于导航分层内容的基于堆栈的方案。好像并没有什么卵用,不过我们继续往下看
导航控制器对象使用有序数组(称为导航堆栈)管理其子视图控制器。数组中的第一个视图控制器是根视图控制器,表示堆栈的底部。数组中的最后一个视图控制器是堆栈中最顶层的项目,表示当前正在显示的视图控制器。您可以使用segues或使用此类的方法从堆栈中添加和删除视图控制器。用户还可以使用导航栏中的后退按钮或使用左边滑动手势来移除最顶层的视图控制器。
导航控制器管理界面顶部的导航栏和界面底部的可选工具栏。导航栏始终存在并由导航控制器本身管理,导航控制器本身使用其子视图控制器提供的内容更新导航栏。当属性为时,导航控制器类似地用最顶层视图控制器提供的内容更新工具栏。toolbarHiddenNO
导航控制器使用其delegate对象协调其行为。委托对象可以覆盖视图控制器的推送或弹出,提供自定义动画过渡,以及指定导航界面的首选方向。您提供的委托对象必须符合协议。UINavigationControllerDelegate
然后后面又告诉我们了隐藏导航栏的方法To hide or show the navigation bar, use the navigationBarHidden property or setNavigationBarHidden:animated: method.那么其实这个方法也是我们最经常使用的方法
setNavigationBarHidden:animated:
请注意哦,后面是带animated,如果不带的话,手势返回会非常蛋疼。
还有一种方式是通过代理,我们知道UINavigationControllerDelegate是代理,
self.navigationController.delegate = self;
设置导航控制器的代理是自己,于是就有了代理方法
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
在将要显示导航栏的时候需要干嘛我们也就都知道了