iOS自定義導(dǎo)航欄-導(dǎo)航欄聯(lián)動(dòng)(一)
iOS自定義導(dǎo)航欄-導(dǎo)航欄聯(lián)動(dòng)(二)
前言
最近通過(guò)對(duì)一些APP的觀察發(fā)現(xiàn)观堂,現(xiàn)在絕大多數(shù)的APP都會(huì)有導(dǎo)航欄聯(lián)動(dòng)效果即:返回時(shí)導(dǎo)航欄會(huì)隨著控制器一起返回呀忧,那么我們應(yīng)該如何來(lái)處理這種情況呢,經(jīng)過(guò)研究及查找資料發(fā)現(xiàn)有以下兩種方式
- 隱藏掉系統(tǒng)的導(dǎo)航欄胰坟,為每一個(gè)控制器添加自定義導(dǎo)航欄泞辐,但是這種方法有個(gè)弊端就是不能夠使用系統(tǒng)導(dǎo)航欄的屬性了
- 通過(guò)一些特殊處理為每個(gè)控制器包裝一個(gè)導(dǎo)航控制器咐吼,但由于導(dǎo)航控制器的子類不能是導(dǎo)航控制器,所以需要再包裝一個(gè)控制器
GKNavigationController使用的是第二種方法厢塘,下面具體說(shuō)一下實(shí)現(xiàn)方法及用法肌幽。
一 - 實(shí)現(xiàn)介紹
首先看一下下面的層次結(jié)構(gòu)
層次結(jié)構(gòu)
1. 根控制器的導(dǎo)航控制器
GKNavigationController
- GKWrapViewController
- GKWrapNavigationController
- 你的VC1
... push
- GKWrapViewController
- GKWrapNavigationController
- 你的VC2
2. UITabBarController作為根控制器
UITabBarController
tab1
GKNavigationController
- GKWrapViewController
- GKWrapNavigationController
- 你的VC1
tab2
GKNavigationController
- GKWrapViewController
- GKWrapNavigationController
- 你的VC2
...
- 如果根控制器是導(dǎo)航控制器喂急,則先將傳入的控制器包裝一層導(dǎo)航控制器GKWrapNavigationController,再將導(dǎo)航控制器包裝一層控制器GKWrapViewController糕簿,然后再交個(gè)根控制器GKNavigationController來(lái)管理画机,它可以管理所有控制器的push和pop操作
- 如果根控制器是UITabBarController,原理相同响禽,只是將多個(gè)GKNavigationController分開(kāi)來(lái)管理
- 如果根控制器是導(dǎo)航控制器,然后再push了一個(gè)UITabBarController隆嗅,這里將會(huì)造成一個(gè)bug:由于UITabBarController及其子控制器都是經(jīng)過(guò)包裝而成的侯繁,push過(guò)后會(huì)出現(xiàn)子類的導(dǎo)航欄不能顯示,我這里的暫時(shí)處理辦法是將UITabBarController的導(dǎo)航欄移除丽焊,但是會(huì)造成子類控制器的返回按鈕無(wú)法顯示咕别,因此需要在每個(gè)子類中重寫(xiě)navigationItem.leftBarButtonItem
二 - 框架特性
- 支持自定義導(dǎo)航欄樣式(隱藏惰拱、透明等)
- 支持控制器開(kāi)關(guān)返回手勢(shì)
- 支持控制器開(kāi)關(guān)全屏返回手勢(shì)
- 支持控制器設(shè)置距離左邊屏幕左邊的滑動(dòng)區(qū)域
- 支持動(dòng)態(tài)設(shè)置導(dǎo)航欄透明度,可實(shí)現(xiàn)漸變效果
- 完美解決UITableView欣孤,UIScrollView滑動(dòng)手勢(shì)沖突
- 支持Push一個(gè)UITabBarController(有缺陷)
三 - Demo部分截圖
001.png
002.png
003.png
004.png
005.png
006.png
缺陷及不足
- 沒(méi)有支持自定義轉(zhuǎn)場(chǎng),實(shí)現(xiàn)如:今日頭條搬瑰、騰訊新聞等的轉(zhuǎn)場(chǎng)效果
- push到一個(gè)UITabBarController時(shí)需要子控制器重新自定義返回按鈕
- 手勢(shì)禁用方法只能在viewDidLoad方法里面實(shí)現(xiàn)控硼,在其他地方修改不起作用
- 其他(待發(fā)現(xiàn))
結(jié)語(yǔ)
這個(gè)框架是我在業(yè)余時(shí)間抽空寫(xiě)的,其中也參考了其他的一些框架如:
RTRootNavigationController 和 FDFullscreenPopGesture
這里特別感謝兩位大神的杰作翼悴,我還只是小白幔妨,希望有感興趣的同行可以一起交流,另外如果你對(duì)這個(gè)框架喜歡的話古话,就去來(lái)個(gè)Star吧
github地址:
GKNavigationController
GKNavigationBarViewController
簡(jiǎn)書(shū)地址:
iOS自定義導(dǎo)航欄-導(dǎo)航欄聯(lián)動(dòng)(一)
iOS自定義導(dǎo)航欄-導(dǎo)航欄聯(lián)動(dòng)(二)