導航欄的隱藏問題
我們的專案頁面經過UI的美化以後有的要導航欄,有的不要導航欄,有的是用h5的導航欄,一直以來簡單的做法都是在viewWillappear裡面把導航欄hidden為Yes,WillDisapper裡面把hidden為No,但是我發現事情沒有那麼簡單。(但是好像安卓的導航欄很簡單啊,感覺他們的改起來很隨意)。
本來假如是我設計蘋果的導航欄,就應該和button一樣,想什麼時候隱藏什麼時候隱藏,想咋用咋用,但其實導航欄用法限制極多,還和手勢返回,頁面堆疊有大大的關係,那麼我們今天討論導航欄隱藏問題的開始,不如先從導航欄是什麼開始。
導航欄是啥
首先我經常有一種錯覺(我說的是我自己),就是導航欄是一個控制元件。因為經常要封裝它或者怎麼樣的,以至於我們忘了導航欄其實是UINavgationController。是的,它是一個控制器,蘋果的開發文件上面是這麼介紹它的
導航欄 is A container view controller that defines a stack-based scheme for navigating hierarchical content.
翻譯過來呢,就是導航欄是一個容器檢視控制器,用於定義用於導航分層內容的基於堆疊的方案。好像並沒有什麼卵用,不過我們繼續往下看
導航控制器物件使用有序陣列(稱為導航堆疊)管理其子檢視控制器。陣列中的第一個檢視控制器是根檢視控制器,表示堆疊的底部。陣列中的最後一個檢視控制器是堆疊中最頂層的專案,表示當前正在顯示的檢視控制器。您可以使用segues或使用此類的方法從堆疊中新增和刪除檢視控制器。使用者還可以使用導航欄中的後退按鈕或使用左邊滑動手勢來移除最頂層的檢視控制器。
導航控制器管理介面頂部的導航欄和介面底部的可選工具欄。導航欄始終存在並由導航控制器本身管理,導航控制器本身使用其子檢視控制器提供的內容更新導航欄。當屬性為時,導航控制器類似地用最頂層檢視控制器提供的內容更新工具欄。toolbarHiddenNO
導航控制器使用其delegate物件協調其行為。委託物件可以覆蓋檢視控制器的推送或彈出,提供自定義動畫過渡,以及指定導航介面的首選方向。您提供的委託物件必須符合協議。UINavigationControllerDelegate
然後後面又告訴我們了隱藏導航欄的方法To hide or show the navigation bar, use the navigationBarHidden property or setNavigationBarHidden:animated: method.那麼其實這個方法也是我們最經常使用的方法
setNavigationBarHidden:animated:
複製程式碼
請注意哦,後面是帶animated,如果不帶的話,手勢返回會非常蛋疼。
還有一種方式是通過代理,我們知道UINavigationControllerDelegate是代理,
self.navigationController.delegate = self;
複製程式碼
設定導航控制器的代理是自己,於是就有了代理方法
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
複製程式碼
在將要顯示導航欄的時候需要幹嘛我們也就都知道了