iOS自定义导航栏-导航栏联动(一)

1字数 822阅读 2009

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
            ...

  1. 如果根控制器是导航控制器,则先将传入的控制器包装一层导航控制器GKWrapNavigationController,再将导航控制器包装一层控制器GKWrapViewController,然后再交个根控制器GKNavigationController来管理,它可以管理所有控制器的push和pop操作
  2. 如果根控制器是UITabBarController,原理相同,只是将多个GKNavigationController分开来管理
  3. 如果根控制器是导航控制器,然后再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方法里面实现,在其他地方修改不起作用
  • 其他(待发现)

结语

这个框架是我在业余时间抽空写的,其中也参考了其他的一些框架如:
RTRootNavigationControllerFDFullscreenPopGesture
这里特别感谢两位大神的杰作,我还只是小白,希望有感兴趣的同行可以一起交流,另外如果你对这个框架喜欢的话,就去来个Star吧

github地址:
GKNavigationController
GKNavigationBarViewController

简书地址:
iOS自定义导航栏-导航栏联动(一)
iOS自定义导航栏-导航栏联动(二)

推荐阅读更多精彩内容