UINavigationController--导航控制器
2016-02-25 17:45
561 查看
一、继承关系
NSObject->UIResponder->UIViewController->UINavigationController二、UIViewController相关的属性配置
说明:下面三个属性,都是针对view controller的父控制器是navigation controller的情景
1、如果view controller加入到navigation controller,那么属性navigationItem标示navigation controller的 navigation bar(导航栏)
var navigationItem: UINavigationItem { get }
2、指示当view controller放入到navigation controller中的时候是否屏幕下边的toolBar(工具栏)是否隐藏
var hidesBottomBarWhenPushed: Bool
3、设置tootBar(工具栏)显示的选项
func setToolbarItems(_ toolbarItems: [UIBarButtonItem]?, animated animated: Bool)
var toolbarItems: [UIBarButtonItem]?
4、返回view controlelr所属的navigation controller
var navigationController: UINavigationController? { get }
三、概述
UINavigationController用来管理多个具有层级关系的视图控制器,用于实现特定的导航跳转功能。四、图示
settings 导航界面:除了root view(根视图),导航控制器提供了一个返回按钮用于返回上级界面五、工作原理
UINavigationController通过栈的方式管理控制器,通过入栈和出栈来展示视图控制器。栈是一个view controllers数组,数组的第一个元素为 root view controller(根视图控制器),最后一个元素为当前展示的view controller。可通过segues 或此类的方法添加或删除视图控制器。
六、UINavigationController管理的两个重要组件
引用官方说明导航控制器管理导航栏(navigationBar)和可选导航工具栏(toolBar)的创建、配置和显示。允许自定义导航栏的外观相关属性,但您必须不更改其frame、bounds、或αlpha值。如果你的子类化UINavigationBar,必须用initWithNavigationBarClass:toolbarClass: 初始化navigation controller。
显示或隐藏navigationBar用属性 navigationBarHidden或者方法setNavigationBarHidden:animated:
导航栏控制器navigation bar的内容通过navigation stack中view controllers相关联的navigation item对象(UINavigationItem类)动态创建的。
1、navigationBar(顶部导航栏)
var navigationBar: UINavigationBar { get }显示隐藏navigationBar
//以动画方式func setNavigationBarHidden(_ hidden: Bool, animated animated: Bool)
self.navigationController.setNavigationBarHidden(true, true)
//静态实现
var navigationBarHidden: Bool
self.navigationController.navigationBarHidden = true
//通过手势或布局实现
var hidesBarsWhenVerticallyCompact: Bool
var hidesBarsWhenKeyboardAppears: Bool
..更多参考
2、toolBar(可选的底部工具栏)
var toolbar: UIToolbar! { get }navigationController自带了一个工具栏,默认是不显示的,通过设置self.navigationController.toolbarHidden = false 来显示工具栏,工具栏中的内容可以通过viewController的toolbarItems来设置,显示的顺序和设置的Array中存放的顺序一致,其中每一个数据都一个UIBarButtonItem对象,可以使用系统提供的很多常用风格的对象,也可以根据需求进行自定义。
显示隐藏toolBar
//以动画方式func setToolbarHidden(_ hidden: Bool,animated animated: Bool)
self.navigationController.setToolbarHidden(true, true)
//静态实现
var toolbarHidden: Bool
self.navigationController.navigationBarHidden = true
例如下面:
class TwoViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //配置工具栏的选项卡按钮风格 let configArr:Array<UIBarButtonSystemItem> = [.Add, .Bookmarks, .Camera, .Cancel, UIBarButtonSystemItem.Compose, .Done, .Edit, .Search, .Stop, .Trash, .Undo, .Rewind, .Reply, .Refresh, .Redo] //创建toolbarItems self.toolbarItems = [] //创建选项卡按钮 for var i = 0; i < configArr.count; i++ { let btn = UIBarButtonItem(barButtonSystemItem: configArr[i], target: self, action: "clickHandler") self.toolbarItems?.append(btn) } } }
效果图如下
七、更新navigationBar
navigationBar有几个部分组成,分别是leftBarButtonItem, titleView ,rightBarButtonItem,backBarButtonItem1、Left side of the navigationBar
a)如果当前的viewController设置了leftBarButtonItem,则显示当前VC所自带的leftBarButtonItem。b)如果当前的viewController没有设置leftBarButtonItem,且当前VC不是rootVC的时候,则显示前一>层VC的backBarButtonItem。如果前一层的VC没有显示的指定backBarButtonItem的话,系统将会根据>前一层VC的title属性自动生成一个back按钮,并显示出来。
c)如果当前的viewController没有设置leftBarButtonItem,且当前VC已是rootVC的时候,左边将不显示任何东西。
2、title部分
a)如果当前VC通过.navigationItem.titleView指定了自定义的titleView,系统将会显示指定的titleView,此处要注意自定>义titleView的高度不要超过navigationBar的高度,否则会显示出界。
b)如果当前VC没有指定titleView,系统则会根据当前VC的title或者当前VC的navigationItem.title的内容创建一个UILabel并显示,其中如果指定了navigationItem.title的话,则优先显示navigationItem.title的内容。
3、Right side of the navigationBar
a)如果当前VC指定了rightBarButtonItem的话,则显示指定的内容。b)如果当前VC没有指定rightBarButtonItem的话,则不显示任何东西。
八、操作视图控制器
navigation controller是通过stack的方式管理 view controller的,在工作原理章节有介绍…几个重要方法
1、把指定的view controller放入到栈中func pushViewController(_ viewController: UIViewController,animated animated: Bool)
2、把栈中顶部的view controller移除
func popViewControllerAnimated(_ animated: Bool) -> UIViewController?
3、跳转到根控制器:
移除除了root viewController的所有元素,更新并显示 root viewController,返回移除的元素。
func popToRootViewControllerAnimated(_ animated: Bool) -> [UIViewController]?
4、跳转到指定的控制器:
把参数中viewController推入栈顶,移除之前在viewController之上面的元素,返回移除的元素。
func popToViewController(_ viewController: UIViewController,
animated animated: Bool) -> [UIViewController]?
5、ios7 手势返回功能:
navigationController添加这个手势到它的view上用来移除栈中最顶端的view controller
var interactivePopGestureRecognizer: UIGestureRecognizer? { get }
//开启这个功能
self.navigationController.interactivePopGestureRecognizer.enabled = true
6、已模态方式展示viewController,同样会把vc压入栈
func showViewController(_ vc: UIViewController, sender sender: AnyObject?)
参数: vc:要展示的vc sender: 展示vc的请求者
九、delegate
可以使用导航代理来执行响应于导航界面中的更改的其他操作。主要用到的方法如下:
optional func navigationController(_ navigationController: UINavigat b5f4 ionController, didShowViewController viewController: UIViewController, animated animated: Bool){ //显示vc后执行的操作 }
optional func navigationController(_ navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated animated: Bool){ //将要显示vc执行的操作 }
相关文章推荐
- iOS开发中导航控制器的基本使用教程
- Swift之UITabBarController 导航控制器的自定义
- iOS开发——导航控制器
- iOS 3行代码搞定导航控制器全屏滑动返回效果
- APP开发之UINavigationController设置
- 导航控制器Navigation
- swift 恢复 滑动返回 手势
- 【IOS 开发学习总结-OC-54】★★ios开发UI 控件——UINavigationBar 与UINavigationController
- iOS-非父子控制器跳转(如:从某一导航控制器的子页面跳转到另一个tabbar控制的页面)
- iOS开发UINavigationController导航控制器初始化,导航控制器栈的push和pop跳转理解
- iOS开发学习之#简单通讯录的制作#
- iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController
- iOS学习之UINavigationController详解与使用(三)ToolBar
- ios导航控制器UINavigationController,控制器a跳转(push)到b后,b跳转(push)到c,但c后退(pop)进入a
- UINavigation
- 导航控制器和表视图(一)
- 导航控制器和表视图(二)
- iOS开发UINavigation系列四——导航控制器UINavigationController
- UINavigationController与简单的页面传值
- 自定义UITabBarController