屏幕顶部的长条中展示的导航控制,通常和一个导航控制器连接。
概述
UINavigationBar对象,是一个长条,通常展示在window的顶部,包含屏幕层次结构中的导航按钮。主要组件有:左(返回)按钮,中间的title,和一个可选的右按钮。我们可以把导航栏作为一个独立的模块使用,或者和导航控制器对象结合使用。
导航栏在导航控制器中最常用。 UINavigationController对象创建、展示、管理相关的导航栏,使用我们添加的视图控制器的属性来控制导航栏上展示的内容。
-
当使用导航控制器来控制导航栏时,需要按照以下步骤:
-
在 Interface Builder中或者代码中,创建导航控制器。
-
使用UINavigationController对象的 navigationBar 属性来配置导航栏的外观。
-
设置每一个push到导航控制器的栈中的 UIViewController 的title 和navigationItem 属性来控制导航栏的内容。
我们可以不使用导航控制器,而独立使用导航栏。要想添加导航栏到接口中,可以按照以下步骤来:
-
在接口中设置自动布局来管理导航栏的位置。
-
创建根 navigationItem来提供初始标题。
-
配置代理对象来处理导航栏的用户交互操作。
-
自定义导航栏的外观。
-
配置APP以便用户在浏览分层屏幕时,push和pop出相关的导航项。
使用带有导航控制器的导航栏
如果使用导航控制器来管理不同屏幕之间的导航,那么导航控制器会自动创建一个导航栏,并在合适的时机push和pop导航项。
当导航视图控制器的栈时,导航控制器使用 UIViewController 的 navigationItem 属性来给导航栏提供model对象。默认的导航项使用视图控制器的title,但是我们可以复写 UIViewController 子类 的 navigationItem 来获取对导航栏内容的完全控制。
导航控制器自动分配自己作为导航栏的代理。因此,当使用导航控制器时,不需要给相应的导航栏分配自定义的代理对象。
使用UINavigationController的navigationBar属性,来访问和导航控制器相关的导航栏。
给独立的导航栏添加内容
大多数情况下,我们使用导航栏作为导航控制器的一部分。然而,有些情况下,我们想使用navigationBar的界面,并实现自己的内容导航方式。在这种情况下,我们可以使用独立的导航栏。
导航栏
当我们使用navigationBar作为一个独立的对象时,我们需要提供其内容。不像其他类型的视图,我们不需要直接给navigationBar添加子视图。而是使用navigationItem来指定都有哪些自定义的按钮和视图。navigationItem有指定导航栏的左、右、中间的视图的属性,和指定自定义提示字符串。上图展示了navigationItem属性如何在导航栏中显示。
导航栏管理栈中的UINavigationItem对象。虽然栈主要是用来支持导航控制器的,但是我们也可以使用它来实现自定义的导航接口。栈中最上面的item代表导航栏当前展示的内容的navigationItem。我们可以使用pushNavigationItem:animated: 方法将新的navigationItem压入栈中,使用popNavigationItemAnimated: 方法将navigationItem弹出栈。这两个操作都可以为用户提供动画设置。
除了压入和弹出navigationItem外,我们还可以通过items属性或者 setItems:animated:方法,直接设置栈中的内容。我们可以在启动时使用这个方法来储存之前的状态,或者依次压入或弹出多个navigationItem。
导航栏栈管理
如果要将导航栏作为一个独立对象使用,那么久需要分配一个自定义的delegate对象给delegate属性,并使用这个对象去拦截来自导航栏的消息。delegate对象必须遵守 UINavigationBarDelegate 协议。代理的通知可以让我们追踪到navigationItem什么时候从栈中压入或弹出。我们可以使用这些通知来更新APP中的其他用户界面。
自定义导航栏外观
导航栏有两个标准的外观style:白底黑字和黑底白字。使用 barStyle 属性来选择style。对导航栏的其他外观属性的更改,都会覆盖 barStyle 中的推出的属性。
导航栏默认是半透明的。也就是说,导航栏的背景色是半透明的。我们可以将translucent 属性设置为NO,来将导航栏设置为不透明的。你可以使用barTintColor属性来为导航栏背景色设置自定义的颜色。设置这个颜色可以覆盖从 barStyle 中的推出的默认色。对于导航栏的交互元素,如按钮image和title,的颜色,可以向UIview的所有子类一样,使用tintColor属性来设置。
titleTextAttributes 属性,设置展示在导航栏中的title文字的属性,可以使用 NSFontAttributeName, NSForegroundColorAttributeName, 和 NSShadowAttributeName 等keys,在文本属性字典中,设置字体,文字颜色,文字阴影颜色,文字阴影偏移。
使用 setTitleVerticalPositionAdjustment:forBarMetrics:方法来调整文本的垂直位置。这个方法可以设置基于导航栏高度的调整,这个调整通过 UIBarMetrics 枚举来表示。图3展示了自定义颜色、title文本属性、导航栏颜色的导航栏。
如果要给导航栏的外观完全自定义,我们可以额外的提供自定义背景和阴影图片。为了自定义的背景图片,使用 setBackgroundImage:forBarPosition:barMetrics: 方法,为导航栏的适当位置和度量值提供UIImage对象。使用 barPosition这个参数的 UIBarPosition 值来指定window底部或顶部所提供的图片。如果图像显示在顶部,则指定是否从状态栏下向上扩展。同样的, 我们可以通过向barmetrics参数提供 UIBarMetrics 值来指定图像应用于压缩或默认的bar指标,无论是否有提示。
要添加阴影,需要提供一个可调整的 UIImage 给 shadowImage 属性。为了使用自定义的阴影图片,我们需要设置自定义背景图片。图4展示了使用 topAttached 位置参数和默认 bar metrics参数来设置 setBackgroundImage(_:for:barMetrics:) ,自定义背景图片的导航栏。为 shadowImage 属性提供一个自定义图片。
网友评论