UINavigationController 小系列(持續(xù)更新):
學習UINavigationController(1):基礎
學習UINavigationController(2):底部TabBar的顯示與隱藏
學習UINavigationController(3):NavigationBar 顯示與隱藏
一诡壁、前言
上篇,我們分析了如何正確的通過繼承 UINavigationBar 并重寫 pushViewController 來正確的設置 tabBar 的顯示與隱藏,本篇,將如題所述那樣放祟,控制頂部導航欄的顯示與隱藏。
導航欄的顯示與隱藏光戈,一般用于的場景:
- 類似天貓杂抽、京東APP首頁,默認隱藏導航欄生音,滾動時宁否,通過過渡動畫來顯示自定義導航欄;
- Hybrid時缀遍,即WKWebView全屏展示H5時慕匠,隱藏原生導航欄,由H5來自主導航欄域醇;
- 查看圖片 / 視頻時台谊,進入與退出全屏時控制導航欄的顯示與隱藏;
- ..... 等等譬挚,還有很多 case锅铅,就不一一列舉;
列舉以上的場景减宣,并不是讓大家去做產(chǎn)品經(jīng)理(雖然盐须,有本書叫作:人人都是產(chǎn)品經(jīng)理;無論是開發(fā)還是測試漆腌,都應該站在用戶的角度去思考贼邓,如何更好更合理的設計出一款APP),而是我們在某些場景下闷尿,頁面的切換(push & pop)需要保持頁面導航欄前后一致性塑径。
二、頁面導航欄前后一致性
本小節(jié)會深入分析 UINavigationController 的原理悠砚,新人需要好好學習晓勇,因為控制不當,容易造成前后不一致(我在上篇前言中,貼了一張 gif 圖绑咱,首頁的導航欄背景色開始是白色绰筛,push 到下一個頁面,導航欄背景是藍色描融,然后 pop 回來铝噩,首頁的導航欄還是藍色,并沒有恢復為白色)窿克;同樣骏庸,多年開發(fā)的老同學,也需要『溫顧而知新』年叮。
-
UINavigationController 在之前就分析過:
- 棧式管理 ViewController具被;
- 棧式管理 navigationItem;
- push & pop 時只损,UINavigationController會 sync一姿,即同步;
-
除此跃惫,還有幾點我沒有提到叮叹,而是特意保留到了本章來講:
- UINavigationController 具有傳遞性(其實就是 sync);
- 每個 UINavigationController 是單獨管理自己的棧的爆存;
-
針對上面兩點蛉顽,我來一一解釋:
- 所謂傳遞性,其實是 navigationBar (類型:UINavigationBar先较,依附于當前的 navigationController 實例)携冤,它是一個針對當前 UINavigationController 實例的統(tǒng)一設定,所以一旦某處作了修改拇泣,將會適用于該 UINavigationController 棧中所有的 VC噪叙,但你可以通過 UINavigationItem 來為其定制左右按鈕,至于修改背景色霉翔,額睁蕾,只能自定義導航欄,除此無它法债朵, 谚中;
- 我們在 UITabBarController 中渴杆,嵌套了 N 個 UINavigationController(ViewController)寥枝,因此,這 N 個 UINavigationController 對象的 VC 棧是獨立的管理的磁奖,不會相互使用囊拜;
另外,針對有多個 UINavigationController (即會生成多個對應的 navigationBar)比搭,可以使用 UINavigationBar 的 UIAppearance 進行全局統(tǒng)一設置冠跷,因為 appearance 是單例。
三身诺、統(tǒng)一處理(了解就行)
UINavigationBar 中有個屬性 isHidden蜜托,為 true 就隱藏,false 就顯示霉赡,但是上篇我也說了橄务,操作 navigationBar 是極度危險的,會對當前棧中所有的 UIViewController 都適用穴亏,所以仪糖,如果我們 previousVC 是隱藏,push 后下一個是顯示迫肖,再 pop 時,previousVC 的導航欄就顯示了攒驰,因此蟆湖,我們需要統(tǒng)一處理,雖然這種方式能夠達到顯示與隱藏的效果玻粪,但是用戶體驗非常不好隅津。
3.1、進入與退出時設置 isHidden
先上圖如下:
上圖我們可以看到兩處非常生硬的導航欄處理:
- push 下一頁時劲室,還沒完全進入伦仍,下一面的導航欄就已經(jīng)顯示了;
- pop 回上一頁時很洋,剛開始動畫充蓝,導航欄就隱藏了;
先給出這種統(tǒng)一處理的代碼:
- 修改 BaseViewController:
- 修改一級頁面 HomeViewController:
- 修改二級頁面 ViewController:
- 修改 CustomNavigationController:
3.2喉磁、退出后再處理導航欄
同樣先上圖如下:
雖然用戶體驗還是非常的差谓苟,但稍微好一點點在于:導航欄在 pop 完全完成后才消失。當然协怒,也不能說這種方式就比上一種要好涝焙,各有側重點吧。
基于上面 3.1 的代碼孕暇,我們只需要稍微修改一下 CustomNavigationController仑撞,實現(xiàn)一個 CustomNavigationControllerDelegate 即可:
那有沒有比這兩種方式更好的處理呢赤兴?當然是有的,下一篇隧哮,我將分享桶良,如何通過自定義導航欄完成以下事:
- ViewController 控制各自的導航欄;
- push & pop 相互不會影響近迁;
- 基于以上兩點艺普,即便顏色、背景不一樣鉴竭,都能較為完美的過渡歧譬;
敬請期待,謝謝搏存!