iOS導(dǎo)航欄顯示與隱藏控制

最近打算整理優(yōu)化一下項目中對導(dǎo)航欄的顯示與隱藏控制

早期做法

由于前期項目中需要隱藏導(dǎo)航欄的頁面不多,早期采用的方案也比較簡單,遵循誰要隱藏自己處理的原則,在需要隱藏的頁面的viewWillAppear執(zhí)行[self.navigationController setNavigationBarHidden:YES animated:YES],viewWillDisappear執(zhí)行[self.navigationController setNavigationBarHidden:NO animated:YES],前期滿足了需求,但是隨著需要隱藏的頁面越來越多,問題也逐漸暴露

  • 需要在viewWillAppearviewWillDisappear控制導(dǎo)航欄的地方越來越多,不便于管理和維護
  • 容易出現(xiàn)人為疏忽,導(dǎo)致導(dǎo)航欄未按預(yù)期展現(xiàn)
  • 切換tabBar的情況下,導(dǎo)航欄有一個向上消失的動畫

升級做法

鑒于早期方案存在的問題,我打算整理一下導(dǎo)航欄的實現(xiàn)方案

我考慮了兩個方案

  • 放棄使用原生navigationBar,改用自定義view,靈活控制導(dǎo)航欄的展現(xiàn)
  • 優(yōu)化現(xiàn)有導(dǎo)航欄顯示隱藏方案

由于項目已經(jīng)比較大,現(xiàn)在改自定義view成本太高,所以我打算先從現(xiàn)有方案的優(yōu)化開始

優(yōu)化方案

基于早期的NavigationController基類進行擴展

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è)置。
這樣就能達到,controller在被加載到navigationController內(nèi),將要展現(xiàn)前,判斷并控制導(dǎo)航欄的顯示或隱藏。
這里還有一個問題需要解決,那就是導(dǎo)航欄被隱藏后,手勢返回功能就會失效,這里就需要我們支持,可以通過interactivePopGestureRecognizer來啟動手勢返回

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
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容