UINavigationBar
一种支持分层内容导航的控件,通常用于UINavigationController中。
一个UINavigationBar
对象是一个横条,它包含在多层次视图中用来导航的按钮,通常展示在窗体的顶部。它的主要组成是一个返回按钮、一个标题和一个可选的右侧按钮。你可以把它当做一个对象单独使用,也可以当做导航控制器的一个对象来使用。
navigation bar
通常在navigation Controller
中使用。UINavigationController
对象创建、显示和管理其关联的导航栏,并使用您添加的视图控制器的属性来控制导航栏中显示的内容。
当做导航控制器的一个对象来使用时,为了管理navigation Bar ,以下步骤是必须的
- 在界面生成器或者代码中创建
navigation Controller
- 通过
UINavigationController
对象上的navigationBar属性设置navigationBar
的外观 - 通过设置每一个push进navigation Controller的栈中的
UIViewController
上的title
和navigationItem
属性 来 控制navigationBar的内容。
你也可以不用navigation Controller,单独只使用一个navigation bar对象。为了在你的界面中添加一个navigation Bar对象,以下步骤是必须的
- 设置自动布局规则来管理navigation bar在你界面中的位置
- 创建一个根导航项来提供初始标题
- 配置一个代理对象来处理navigation bar的用户交互
- 自定义navigation bar的外观
- 配置你的APP,当用户操作多层视图时 推入或弹出相关的导航项(Configure your app to push and pop relevant navigation items as the user navigates through the hierarchical screens)
Using a Navigation Bar with a Navigation Controller
如果你使用导航控制器来管理不同视图内容之间的导航,导航控制器会自动创建一个导航条,并在合适的时机push和pop导航项
当管理导航控制器栈中的自控制器时,导航控制器使用UIViewController
中的navigationItem
属性给navigationBar
提供模型对象。默认的导航项会使用View Controller
的title
,你可以在 View Controller
的子类中重写 navigationItem
来获取对navigation Bar
内容的绝对管理权。
导航控制器会自动设置自己作为navigation bar
对象的代理。因此,当使用navigation Controller
时,不要给navigation bar
对象设置自定义的代理对象。
Adding Content to Standalone Navigation Bar
在绝大多数情况下,你会导航条作为导航控制器的一部分来使用。但是也可能会有这种情况:你想使用navigation bar
的UI 来实现自定义的内容导航。这种情况下,可以使用一个单独的navigation bar
.
当使用单独的navigation bar
对象时,你应该提供它的内容设置。它不像其他类型的视图,不能直接给navigation Bar
添加子控件。你可以通过navigation item
来指定你想展示的是什么样的视图或者按钮。(ps:navigation Item
是 UINavigationItem
的实例)。 一个navigation Item
有属性用来指定navigation Bar
上的左、右和中间视图 还有指定自定义的提示文字。 下图展示了navigation Item
的属性 如何在navigation Bar
上展示它们自己的。
Figure 1 Navigation bar
一个navigation Bar
管理了 一堆 UINavigationItem
对象。虽然这里的堆栈主要用于支持navigation Controllers
,你仍然可以用它来实现自定义的导航界面和交互。 栈中最顶部的对象 代表内容现在被navigation Bar
展示 的navigation Item
。 你可以通过 pushItem(_:animated:)
方法想navigation bar
的栈中添加新的navigation Item
,也可以通过 popItem(animated:)
方法 将navigation Bar
栈中的navigation Item
移出栈中。为了提升用户体验,这些操作都可以是带有动画的。 除了对navigation Item
对象执行 出栈 入栈操作之外,你也可以直接通过 items
属性 或者 setItems(_:animated:)
方法设置栈中的内容。
Figure 2 Navigation Bar stack management
如果把navigation Bar
作为一个单独的对象来使用,需要配置一个自定义的代理对象用来拦截navigation Bar
发出的消息。代理必须遵循 UINavigationBarDelegate
协议。代理通知能让你追踪navigation Items
入栈或出栈的时候,你可以通过这些通知来更新应用中其他的用户界面
自定义navigation Bar的样式
navigation Bar
有两种标准样式:白色与黑色文本或黑色与轻文本。用 barStyle
属性来选择样式。你对navigation Bar
的属性做的任何修改都会覆盖从 barStyle
属性推断出来的结果。(也就是 以你的修改为主)navigation bar
默认是透明的,因为,它们的背景色是半透明的。你可以通过 设置isTranslucent
属性为false
来让navigation Bar
不透明。
可以通过 barTintColor
属性给navigation Bar
设置自定义的背景色。设置这个属性后将会覆盖从 barStyle
属性中推断出的默认背景色。与所有UIView
子类一样,您可以使用tintColor
属性控制导航栏内的交互元素的颜色,包括按钮图像和标题。titleTextAttributes
属性指定了navigation Bar
标题文字的属性,你可以指定标题文字的大小、文字颜色、文字阴影颜色、文字阴影偏移量在文本属性字典中分别使用 font
、 foregroundColor
、 shadow
关键字。 用 setTitleVerticalPositionAdjustment(_:for:)
方法调整标题的垂直位置。这个方法允许你根据导航条的高度做指定的调整,其中导航条的高度是根据 UIBarMetrics 枚举类型的值来展示的。
Figure 3 Navigation bar fonts and colors
图三展示了一个自定义按钮颜色、背景色和文字属性的navigation bar
为了允许对导航栏外观进行完全的定制,你可以另外提供自定义背景和阴影图像。为提供自定义背景图像,请使用setBackgroundImage(_:for:barMetrics:)
方法,为适当的bar位置和度量值提供一个UIImage
对象。给 barPosition
参数传一个UIBarPosition
类型的值用来指定是在窗口的顶部还是底部应用image
对象,是否在顶部出现,是否将它向上延伸到状态栏下。同样的,你也可以通过给barMetrics
参数传一个UIBarMetrics
类型的值用来指定image
对象是用在默认状态还是紧凑状态、有没有提示。
通过给shadowImage
属性设置一个可缩放的UIImage
来添加一个阴影图像。要使用自定义阴影图像,您需要指定自定义背景图像。图四展示了一个使用自定义背景图的navigationBar
,通过setBackgroundImage(_:for:barMetrics:)
这个方法,并给position
参数传值 topAttached
,给bar metrics
参数传值 default
。同时给 shadow Image
属性增加了一个自定义的图像。
Figure 4 Navigation bar with custom background and shadow images
界面构造属性
表一列出了属性检查器中配置navigations Bar
的核心属性
Table 1 Core Attributes
属性 | 描述 |
---|---|
Style | 指定应用于导航栏的UI栏样式。导航条样式控制标题颜色和背景颜色,但是您可以重写这些属性替换这些属性的默认值。选择半透明使导航条半透明。在运行时使用barStyle 和isTranslucent 属性访问这些值。 |
Bar Tint | 控制navigation Bar 的背景色,这个属性会修改Style 样式默认的值。如果Translucent 属性被选择,则背景色会自动设置为半透明。在运行时使用barTintColor 属性来访问这个值 |
Shadow Image | 代表用在navigation Bar 底部的图像。这个image 对象被水平拉伸以匹配导航栏的宽度。在运行时使用ShadowImage 属性来访问这个值 |
Back Image | 指定在后退按钮的前边出现的图像。这个属性必须与后面的Back Mask 属性一起使用。在运行时使用backIndicatorImage 属性访问此值。 |
Back Mask | 指定Back Image 属性关联的mask。这用于控制动画转换期间的后退按钮的外观,因此必须与Back Image 属性一起使用。在运行时使用backIndicatorTransitionMaskImage 属性 访问此值。 |
表2 列出了影响navigation bar
标题样式的属性
属性 | 描述 |
---|---|
Title Font | 该属性用于设置处于navigation Bar 中间的文字的字体。在运行时通过titleTextAttributes 属性中存储的字典 关键字 font 对应的值来访问这个属性 |
Title Color | 该属性用于设置navigation Bar 标题的文字颜色,在运行时通过titleTextAttributes属性中存储的字典 关键字 foregroundColor 对应的值来访问这个属性 |
Title Shadow | 该属性用于指定navigation Bar 标题阴影的颜色和偏移量。在运行时通过titleTextAttributes 属性中存储的字典 关键字 shadow 对应的值来访问这个属性 |
Internationalization国际化
要使导航条国际化,请为导航项目模型对象的每个显示的字符串属性指定一个本地化的字符串