NavigationController 已经洗干净了, 就等你来
一. 基本屬性
-
設置顏色
如果項目中 Navigation 都是統一的,而你又懶得單獨抽取一個BaseNavigationController,可以直接在 [appDelegate didFinishLaunchingWithOptions]方法中寫
-
實現 NavigationBar 透明效果
實現透明可能大家第一個想到的是 設置 alpha 值,但是由于設置了作為父控件的 NavigationBar 的透明度后,其子控件 BarButtonItem 也會隨之改變,因此想要實現導航欄透明,但是 BarButtonItem 正常顯示(類似 手機QQ 的好友動態頁),可以采用下面的方法
// 設置一個空的圖片背景圖片,就能實現導航欄透明但是 BarButtonItem 正常顯示 [self.navigationController.navigationBar setBackgroundImage:[UIImage new]forBarMetrics:UIBarMetricsDefault];然而設置之后乍一看沒問題,可仔細一看你會發現NavigationBar下面還有一條細線,這個細線就是shadow
快看那條淡淡的細線!
層級關系圖
可通過以下代碼來去掉
// 設置一個空的 shadowImage 來實現 self.navigationController.navigationBar.shadowImage = [UIImage new];那么有同學可能要問了,一直透明的可以通過上述方法來實現,那如果想要隨著 上拉距離的改變,實現其透明度動態變化要怎么做?
// 這個就要監聽 scrollView 的 offset // 然后獲取到 NavigationBar復合視圖 的顯示子控件,動態改變其透明度 [[self.navigationController.navigationBar subviews] objectAtIndex:0].alpha = 0;既然講到這里了就說下來回 push 或 pop,以及使用手勢來返回的時候,上下層級之間 NavigationBar 隱藏與否的設置,因為如果這里沒處理好的話,會有一個黑條,或者直接顯示下一層級的視圖,體驗特別差,這時候就需要通過動畫的方式的在下一層級進行設置
- (void)viewWillAppear:(BOOL)animated{[super viewWillAppear:animated];// 當前 VC 需要顯示 navigationBar 就設置為 NO,需要隱藏就設置為 YES[self.navigationController setNavigationBarHidden:YES animated:YES]; }-
側滑手勢相關
很多時候,leftBarButtonItem需要自定義,因為默認的顯示上一層級的title不一定是我們想要的,但是自定義改變之后,會發現側滑返回的手勢不好使了
-
由于項目中同一個 VC,有時候是 modal 出來的,有時候是 push 出來的,那么在這個VC中就要判斷進行處理
NSArray *viewcontrollers=self.navigationController.viewControllers; if (viewcontrollers.count > 1) {if ([viewcontrollers objectAtIndex:viewcontrollers.count - 1] == self) { // push方式 [self.navigationController popViewControllerAnimated:YES]; } } else { // present方式 [self dismissViewControllerAnimated:YES completion:nil]; } -
如果要實現如下效果的導航欄,設置 leftBarButtonItems 和 rightBarButtonItems 即可
喂!焦點在 NavigationBar,老看 tableView 干啥!
-
關于 rootVC 的 offset,先來看幾個 ViewController 的屬性
- iOS7以后默認設置是 UIRectEdgeAll,translucent 的默認值是 true,這個組合會使 rootView 的布局從 (0, 0) 開始,就會造成 rootView 被 NavigationBar 遮擋住一部分,將 edgesForExtendedLayout 設置為 UIRectEdgeNone 即可解決問題
- automaticallyAdjustsScrollViewInsets 默認值是 YES,表示在全屏下會自動將 第一個添加到 rootVC 的 ScrollView 的 contentInset 設置為 (64, 0, 0, 0),這樣 scrollView 就不會被導航欄遮擋住了
二. 來回跳轉
項目中有個需求是A push 到 B, B push 到 C, C pop 到 D,D 再 pop到 A,就好比這樣:
類似這種交叉跳轉的感覺
- 首先 A push 到 B,直接使用 [self.navigationController pushViewController:B animated:YES]; // 此時 self.navigationController.childViewControllers = [A, B];
- 然后 B push 到 C,同理 [self.navigationController pushViewController:C animated:YES]; // 此時 self.navigationController.childViewControllers = [A, B, C];
- 現在要實現 C pop 到 D,由于 navigationController.childViewControllers 是只讀的,因此不能直接對其進行操作
navigationController.childViewControllers 是只讀的
最后的效果如圖
對,效果如圖
就四這么簡單!
如果有其他問題,可以在留言處寫下來,不定期更新
?
來自:http://www.jianshu.com/p/a1a0c053fb12
轉載于:https://www.cnblogs.com/fakeCoder/p/5093731.html
總結
以上是生活随笔為你收集整理的NavigationController 已经洗干净了, 就等你来的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker php 环境搭建docke
- 下一篇: 影响布局的inline-block的空白