iOS自定义导航栏-导航栏联动(一)
2017-07-19 本文已影响621人
QuintGao
iOS自定义导航栏-导航栏联动(一)
iOS自定义导航栏-导航栏联动(二)
前言
最近通过对一些APP的观察发现,现在绝大多数的APP都会有导航栏联动效果即:返回时导航栏会随着控制器一起返回,那么我们应该如何来处理这种情况呢,经过研究及查找资料发现有以下两种方式
- 隐藏掉系统的导航栏,为每一个控制器添加自定义导航栏,但是这种方法有个弊端就是不能够使用系统导航栏的属性了
- 通过一些特殊处理为每个控制器包装一个导航控制器,但由于导航控制器的子类不能是导航控制器,所以需要再包装一个控制器
GKNavigationController使用的是第二种方法,下面具体说一下实现方法及用法。
一 - 实现介绍
首先看一下下面的层次结构
层次结构
1. 根控制器的导航控制器
GKNavigationController
- GKWrapViewController
- GKWrapNavigationController
- 你的VC1
... push
- GKWrapViewController
- GKWrapNavigationController
- 你的VC2
2. UITabBarController作为根控制器
UITabBarController
tab1
GKNavigationController
- GKWrapViewController
- GKWrapNavigationController
- 你的VC1
tab2
GKNavigationController
- GKWrapViewController
- GKWrapNavigationController
- 你的VC2
...
- 如果根控制器是导航控制器,则先将传入的控制器包装一层导航控制器GKWrapNavigationController,再将导航控制器包装一层控制器GKWrapViewController,然后再交个根控制器GKNavigationController来管理,它可以管理所有控制器的push和pop操作
- 如果根控制器是UITabBarController,原理相同,只是将多个GKNavigationController分开来管理
- 如果根控制器是导航控制器,然后再push了一个UITabBarController,这里将会造成一个bug:由于UITabBarController及其子控制器都是经过包装而成的,push过后会出现子类的导航栏不能显示,我这里的暂时处理办法是将UITabBarController的导航栏移除,但是会造成子类控制器的返回按钮无法显示,因此需要在每个子类中重写navigationItem.leftBarButtonItem
二 - 框架特性
- 支持自定义导航栏样式(隐藏、透明等)
- 支持控制器开关返回手势
- 支持控制器开关全屏返回手势
- 支持控制器设置距离左边屏幕左边的滑动区域
- 支持动态设置导航栏透明度,可实现渐变效果
- 完美解决UITableView,UIScrollView滑动手势冲突
- 支持Push一个UITabBarController(有缺陷)
三 - Demo部分截图
001.png 002.png 003.png 004.png 005.png 006.png缺陷及不足
- 没有支持自定义转场,实现如:今日头条、腾讯新闻等的转场效果
- push到一个UITabBarController时需要子控制器重新自定义返回按钮
- 手势禁用方法只能在viewDidLoad方法里面实现,在其他地方修改不起作用
- 其他(待发现)
结语
这个框架是我在业余时间抽空写的,其中也参考了其他的一些框架如:
RTRootNavigationController 和 FDFullscreenPopGesture
这里特别感谢两位大神的杰作,我还只是小白,希望有感兴趣的同行可以一起交流,另外如果你对这个框架喜欢的话,就去来个Star吧
github地址:
GKNavigationController
GKNavigationBarViewController