最近打算整理優(yōu)化一下項(xiàng)目中對(duì)導(dǎo)航欄的顯示與隱藏控制
早期做法
由于前期項(xiàng)目中需要隱藏導(dǎo)航欄的頁面不多,早期采用的方案也比較簡單幔嗦,遵循誰要隱藏自己處理的原則,在需要隱藏的頁面的viewWillAppear
執(zhí)行[self.navigationController setNavigationBarHidden:YES animated:YES]
鹏倘,viewWillDisappear
執(zhí)行[self.navigationController setNavigationBarHidden:NO animated:YES]
刁愿,前期滿足了需求,但是隨著需要隱藏的頁面越來越多豪墅,問題也逐漸暴露
- 需要在
viewWillAppear
和viewWillDisappear
控制導(dǎo)航欄的地方越來越多泉手,不便于管理和維護(hù) - 容易出現(xiàn)人為疏忽,導(dǎo)致導(dǎo)航欄未按預(yù)期展現(xiàn)
- 切換tabBar的情況下偶器,導(dǎo)航欄有一個(gè)向上消失的動(dòng)畫
升級(jí)做法
鑒于早期方案存在的問題斩萌,我打算整理一下導(dǎo)航欄的實(shí)現(xiàn)方案
我考慮了兩個(gè)方案
- 放棄使用原生navigationBar,改用自定義view屏轰,靈活控制導(dǎo)航欄的展現(xiàn)
- 優(yōu)化現(xiàn)有導(dǎo)航欄顯示隱藏方案
由于項(xiàng)目已經(jīng)比較大术裸,現(xiàn)在改自定義view成本太高,所以我打算先從現(xiàn)有方案的優(yōu)化開始
優(yōu)化方案
基于早期的NavigationController
基類進(jìn)行擴(kuò)展
viewDidLoad() {
super.viewDidLoad()
self.delegate = self
}
extension ZYNavigationController: UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
// 判斷要顯示的控制器是否是自己
let isHidden = viewController.isKind(of: FourthViewController.self) || viewController.isKind(of: FirstViewController.self)
self.setNavigationBarHidden(isHidden, animated: true)
}
}
遵循UINavigationControllerDelegate
亭枷,在willShow viewController
方法內(nèi)判斷當(dāng)前viewController是否需要隱藏導(dǎo)航欄袭艺,并根據(jù)判斷結(jié)果設(shè)置。
這樣就能達(dá)到叨粘,controller在被加載到navigationController內(nèi)猾编,將要展現(xiàn)前,判斷并控制導(dǎo)航欄的顯示或隱藏升敲。
這里還有一個(gè)問題需要解決答倡,那就是導(dǎo)航欄被隱藏后,手勢(shì)返回功能就會(huì)失效驴党,這里就需要我們支持瘪撇,可以通過interactivePopGestureRecognizer
來啟動(dòng)手勢(shì)返回
viewDidLoad() {
super.viewDidLoad()
self.delegate = self
}
extension ZYNavigationController: UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
// 判斷要顯示的控制器是否是自己
let isHidden = viewController.isKind(of: FourthViewController.self) || viewController.isKind(of: FirstViewController.self)
self.setNavigationBarHidden(isHidden, animated: true)
if isHidden {
self.interactivePopGestureRecognizer?.delegate = self
self.interactivePopGestureRecognizer?.isEnabled = true
}
}
}