IOS

UINavigationController详解

2019-08-04  本文已影响0人  书上得来终觉浅

1 概述

UINavigationController继承自UIViewController,是一个基于栈的容器型控制器。既然是容器,它就能装一些东西,比如UIView能装各种组件(UILabel,UIButton等),UINavigationController装的是视图控制器。

一个UINavigationController包含了几个部分,

2 Navigation Stack导航栈

UINavigationController的作用是以栈的方式管理UIViewController,所以方法基本上是围绕进出栈的。

3 导航栏显示与隐藏

导航栏显示与否是UINavigationController控制的,NavigationController提供了如下方法显示与隐藏导航栏。

- (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated; 

4 UINavationBar 导航条

导航条比较特别,它的创建,配置和显示是由UINaviagtionController负责的,而内容是由子视图控制器提供的,具体是navigationItem。

4.1 导航条内容定制

导航条的内容是由当前子视图控制器的navigationItem属性确定的,内容主要分为左边项,标题项以及右边项。

4.1.1 左边按钮定制

除了根视图控制器,在栈中的其他子视图控制器中,导航条的左边存在一个返回按钮,定制这个按钮的规则如下:

navigationItem还有一个属性是leftBarButtonItems,它允许用户定义一个按钮集合放在导航条的左边。

4.1.2 标题定制

UINavigationController根据下面的顺序更新导航栏的标题项:

titleView是UIView的实例,也就是说标题可以是任意UIView的子类,上面的UILabel也是UIView的子类。

4.1.3 右边按钮定制

栈顶视图控制器设置了navigationItem.rightBarButtonItem时,UINavigationController会将其设置内容更新在导航栏的右边,如果没有设置,则在导航栏的右边不显示任何内容。

leftBarButtonItem、rightBarButtonItem以及backBarButtonItem都是UIBarButtonItem类型的。也就是说,如果我们要在导航条上定义按钮,就得使用UIBarButtonItem对象,如果系统提供的UIBarButtonItem的属性满足不了我们的需求,可以使用UIBarButtonItem.customView属性来包裹我们指定的视图。

4.2 导航栏的外观定制

导航栏的外观定制有两种方式,一种是通过navigationBar的实例定制,另一种是通过UIAppearance来获取实例类的外观代理对象定制外观,UIAppearance是一个协议(Protocol),实现了这个协议的类可以通过它的appearance方法获取这个类的外观代理,UIView已经实现了这个协议。通过UIAppearance外观代理类设置的外观是全局性的。

4.2.1 BarStyle导航条样式

导航栏默认有两种标准的显示样式:白底黑字和黑底白字,可以通过navigationBar.barStyle属性设置。

//把app中的所有导航条都设置为黑底白字
[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];

//把myNavController下的导航条设置为黑底白字的样式,其他navigationController中的不会改变
[myNavController.navigationBar setBarStyle:UIBarStyleBlack]

4.2.2 translucent 透明度

导航条默认是半透明的(translucent),可以设置起为不透明,

[[UINavigationBar appearance] setTranslucent:NO];

需要注意的是,translucent=YES时,子视图控制器的self.view的原点在整个屏幕中的位置是导航栏的左上方(这个好理解,因为导航栏是透明的,有点像css的绝对定位,所以控制器的view会顶上去,那么原点的位置就发送了变化),当translucent=NO时,控制器的self.view的原点在屏幕中的位置在导航栏的左下方。

当translucent=YES时,可设置控制器的edgesForExtendedLayout属性来改变view的原点在屏幕中的位置

//从navigationBar下面开始计算一直到屏幕tabBar上部
self.edgesForExtendedLayout = UIRectEdgeNone;
//从屏幕边缘计算(默认)
self.edgesForExtendedLayout = UIRectEdgeAll; 
//navigationBar下面开始计算一直到屏幕tabBar上部
self.edgesForExtendedLayout = UIRectEdgeTop;
//从navigationBar下面开始计算一直到屏幕底部
self.edgesForExtendedLayout = UIRectEdgeBottom;

4.2.3 导航栏的字体与颜色

导航栏的字体与颜色分别由以下几个属性控制:

导航栏字体与颜色

4.2.4 导航栏透明

是导航栏完全透明可以设置背景图片和阴影图片两个属性。按照业务需求,一般只有个别的页面要求导航栏透明,所以这不使用全局设置,而在具体的ViewController中设置

[self.navigationController.navigationBar setBackgroundImage:[UIImage new]
                                              forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.shadowImage = [UIImage new];
//通常导航栏透明,需要上移self.view原点的位置,这里还设置了translucent
self.navigationController.navigationBar.translucent = YES;
上一篇 下一篇

猜你喜欢

热点阅读