此篇文章使用Swift简单实现了统一定制多样导航栏样式的功能, 而不必每次都在对应的导航控制器内对导航栏就行重复样式操作。
实现思路
如标题所示,关键功能在统一和多样。那么下面就具体说说如何实现统一和多样功能。
统一
要做到统一处理导航栏,首先会想到自定义一个导航控制器继承自UINavigationController,然后在自定义的导航控制器内统一设置导航栏。这样仅仅做到了统一设置固定的导航栏样式,还无法实现根据不同控制器定制不同样式的导航栏。
多样
上面做到了统一处理导航栏,那么多样怎么做呢?在实现多样之前,我先介绍下导航控制器push和pop的机制:
(1)导航控制器初始化的时候一般都有一个根视图控制器,导航控制器相当于一个栈,里面装的是视图控制器,最先进去的在最下面,最后进去的在最上面。在最上面的那个视图控制器的视图就是这个导航控制器对外展示的界面,也就是用户看到的界面。
(2)我们需要把导航控制器加载到APP中,需要把这个导航控制器设置为window的根视图控制器(都是控制器类,可以赋值),这样就相当于加载到了window里。
(3)我们要在栈中新增或者删除一个视图控制器,就需要得到导航控制器,一般在栈中得所有视图控制器都有一个self.navigationController,意思是我的导航控制器,也就是这个视图控制器所在的导航控制器,这样就拿到了导航控制器。
(4)栈中新增视图控制器用pushViewController,其实就是push进去一个,这样对于用户而言就是打开一个新界面了。
(5)栈中删除一个视图控制器用popViewControllerAnimated,当然这个pop只能pop最上面的那个,对于用户而言相当于从当前视图回到上一级视图。
(6)其实这个push和pop对于用户而言都是打开和跳转页面的一个操作。而pop由更多地操作方法,如一下子pop掉只剩下一个根视图控制器,那么就相当于从好几层直接回到最原始的主页面。也可以指定pop几个,以跳转到指定的页面。
(7)最重要的应该就是这个push和pop方法,push只有一种而pop有很多种。
经过以上的讲解,我们就不难想到如何多样的处理导航控制器导航栏的样式了。没错,我们可以重写系统导航控制器push和pop方法,在方法内部根据self.childViewControllers.count的个数以及与跟控制器的比较来区分不同的视图控制器,做到多样定制。值得注意的是对于pop操作我们需要分别重写popViewController,popToRootViewController,popToViewController三个方法(函数)。
多说无益,代码链接奉上:LPFNavigationController