navigation's skills




navigation技巧

[A].獲取 導航欄所有的視圖控制器

獲取 導航欄所有的視圖控制器伍茄,選擇想要跳轉(zhuǎn)的那個視圖控制器直接傳值淹朋!無需考慮“反向傳值”F唱蒸!

展示例子??:

跳轉(zhuǎn)關系:
MyInfosViewController(我的信息) → VerifyIdentityViewController(驗證 手機號) → WriteNewPhoneNumberViewController(更改手機號)

各界面的層次關系:



修改舊的手機號成功!
跳轉(zhuǎn)到“我的信息”界面烛愧,并把手機號傳到“我的信息”界面油宜!

NSArray *pushVCAry = [self.navigationController viewControllers];
//pushVCAry.count-3  回到MyInfosVC中去
MyInfosViewController *popVC = [pushVCAry objectAtIndex:pushVCAry.count-3]; //(-1:當前層)

//可直接“進行傳值”
popVC.transmitPhoneNumberStr = _phoneNumTF.text; 
[self.navigationController popToViewController:popVC animated:YES];


也可以直接判斷
要跳轉(zhuǎn)回去的ViewController 是否為 “ MyInfosViewController”類型?

NSArray *pushVCAry = [weakSelf.navigationController viewControllers];
UIViewController *popVC;

for (int i = 0; i < pushVCAry.count; i ++) {
  if ([pushVCAry[i] isKindOfClass:[MyInfosViewController class] ]) {
     popVC = pushVCAry[i];
  }
}

//可直接“進行傳值”
popVC.transmitPhoneNumberStr = _phoneNumTF.text; 
[self.navigationController popToViewController:popVC animated:YES];




[B].判斷在當前UIViewController中怜姿,viewWillDisappear的時候是push還是pop
- (void)viewWillDisappear:(BOOL)animated {
        NSArray *viewControllers = self.navigationController.viewControllers;
        if (viewControllers.count > 1 && [viewControllers objectAtIndex:viewControllers.count-2] == self) {
            // View is disappearing because a new view controller was pushed onto the stack
            NSLog(@"New viewcontroller was pushed");
        } else if ([viewControllers indexOfObject:self] == NSNotFound) {
            // View is disappearing because it was popped from the stack
            NSLog(@"Viewcontroller was popped");
        }
    }














導航欄 navigationBar

  • 系統(tǒng)自帶圖標文字顏色:(setTintColor

    [self.navigationController.navigationBar setTintColor:[UIColor whiteColor] ];
    


  • 標題文字的設置:(富文本 --- setTitleTextAttributes

    [self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor redColor]}];
    


  • 半透明屬性設置

    self.navigationController.navigationBar.translucent = NO;
    
    在iOS 6之前(包括iOS 6) translucent默認就是NO慎冤,在iOS 7之后就默認是YES了。





[A].隱藏 導航欄邊框下面的黑線

一般:在“viewWillAppear”里(當前界面)沧卢,隱藏 導航欄邊下的黑線蚁堤;
在“viewWillDisappear”里(下個界面),再顯示 導航欄邊下的黑線但狭。

  • 方法一
    //隱藏 導航欄邊下的黑線
    [self.navigationController.navigationBar setShadowImage:[[UIImage alloc] init]];
    

  • 方法二
    //隱藏 導航欄邊下的黑線  
    self.navigationController.navigationBar.clipsToBounds = YES; 
    

  • 方法三

    獲取導航欄邊下黑線披诗,再隱藏G思础!

    //獲取 某個視圖邊下的黑線  
    - (UIImageView *)getNavBlackWithBar:(UIView *)bar {    
      if ([bar isKindOfClass:[UIImageView class]] && bar.frame.size.height < 1) {
          return (UIImageView *)bar;
      }
      for (UIView *views in bar.subviews) {
          UIImageView *imageView = [self getNavBlackWithBar:views];
          if (imageView) {
              return imageView;
          }
      }
      return nil;
    
    }
    


    使用:

    //獲取 導航欄邊下的黑線  
    UIImageView* blackLineImageView = [self getNavBlackWithBar:self.navigationController.navigationBar];
    //去掉導航欄邊下的黑線  
    blackLineImageView.hidden = YES;
    




[B].返回按鈕
  • 自己這一 呈队,設置 (Push到的)子層返回按鈕剥槐。

    //自己的返回按鈕
    self.navigationController.navigationBar.backIndicatorImage = [UIImage imageNamed:@"navbar_icon_back"];//圖片
    UIBarButtonItem * item = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:nil action:nil ];
    self.navigationItem.backBarButtonItem = item;
    

    自帶返回手勢!O艽荨粒竖!
    有時候返回(設置背景圖片)時,會產(chǎn)生卡頓<赣凇H锩纭!Q嘏怼朽砰!


  • 解決:在(Push到的)子層 ,設置 返回按鈕

    //左側 返回按鈕
    UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
    //點擊按鈕  (pop操作)
    [backButton addTarget:self.navigationController action:@selector(popViewControllerAnimated:) forControlEvents:UIControlEventTouchUpInside];
    
    /** 設置 背景顏色:方便觀察Button的大小 */
    //button.backgroundColor = [UIColor grayColor];
    
    /** 設置 圖片 */
    UIImage *imgForButton = [UIImage imageNamed:@"navbar_icon_back"];
    [backButton setImage: imgForButton forState:UIControlStateNormal];
    
    /** 設置 文字 */
    NSString *titleStr = @"返回";
    [backButton setTitle:titleStr forState:UIControlStateNormal];
    //字體大小
    backButton.titleLabel.font = [UIFont systemFontOfSize:17.f];
    //字體顏色
    [backButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    
    
    /** 尺寸調(diào)整 */
    backButton.frame = CGRectMake(0, 0 , 100, 100); //硬編碼:設置UIButton位置喉刘、大小
    //文本尺寸
    CGSize titleLabelSize = [titleStr sizeWithAttributes:@{NSFontAttributeName:backButton.titleLabel.font}];
    //圖片尺寸
    CGSize buttonImageSize = imgForButton.size; 
    //最終的寬度:文本尺寸的寬度+圖片尺寸的寬度
    backButton.frame = CGRectMake(0,0,buttonImageSize.width + titleLabelSize.width, buttonImageSize.height);
    
    
    //左側的leftBarButtonItem瞧柔,使用返回按鈕
    UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
    self.navigationItem.leftBarButtonItem = barButtonItem;
    



隱藏返回按鈕
  • 上一層 視圖控制器 (無字,且 無點擊事件響應

    // 隱藏“返回”按鈕    可點擊(無字饱搏,且 無點擊事件響應)
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:self action:nil];
      
    //??將“返回”按鈕的文字設置不在界面顯示
    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(NSIntegerMin, NSIntegerMin) forBarMetrics:UIBarMetricsDefault];
    


  • 下一層 視圖控制器 (直接隱藏)

    // 隱藏“返回”按鈕
    [self.navigationItem setHidesBackButton:YES];
    




[C].設置 圖片背景 setBackgroundImage

使用的圖片:

lucencyNavgationBar_ios7”:透明圖片非剃;
navgationBar_ios7”:藍色漸變色圖片。


基本設置格式
導航欄推沸、狀態(tài)欄(作為整體)顯示的都是圖片备绽!!

/** 設置為圖片(狀態(tài)欄+導航欄) */
UIImage * Nav_BG_img = [[UIImage imageNamed:@"navgationBar_ios7"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0) resizingMode:UIImageResizingModeStretch];//圖片 自適應大小
[self.navigationController.navigationBar setBackgroundImage:Nav_BG_img forBarMetrics:UIBarMetricsDefault];
效果:


錯誤展示

導航欄背景圖片(backgroundImage) 設置為 無圖片image 或 “nil”。

//設置導航欄背景圖片 為 無圖片的image
[self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];

或者:

//設置導航欄背景圖片 為 nil
[self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];


效果:


總結
  • 1.因為導航欄是同一個鬓催!而每個界面里導航欄造型 不同肺素!
    設置背景圖片,改變導航欄的外觀宇驾!需要對每個界面出現(xiàn)前(在“-(void)viewWillAppear:(BOOL)animated { }”里)進行設置倍靡!

    需要“-(void)viewWillAppear:(BOOL)animated { }”、“-(void)viewWillDisappear:(BOOL)animated { }”配合使用课舍!

  • 2.使用圖片背景來設置界面里導航欄造型時塌西,能使 系統(tǒng)自帶的“返回按鈕,不然會出現(xiàn)“跳轉(zhuǎn)卡頓”的現(xiàn)象筝尾!

    需在每個界面里捡需,設置各界面的“返回按鈕!(在當前層里筹淫,設置返回按鈕)




讓頁面導航欄透明:(背景圖片 設置為透明圖片)

//透明的圖片
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"lucencyNavgationBar_ios7"] forBarMetrics:UIBarMetricsDefault];

//去掉 透明導航欄邊的黑邊
[self.navigationController.navigationBar setShadowImage:[[UIImage alloc] init]];

效果:



查看視圖的層次關系:






一般操作:
在“-(void)viewWillAppear:(BOOL)animated { }”里面:
//透明的圖片
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"lucencyNavgationBar_ios7"] forBarMetrics:UIBarMetricsDefault];
//去掉 透明導航欄邊的黑邊
[self.navigationController.navigationBar setShadowImage:[[UIImage alloc] init]];
在“-(void)viewWillDisappear:(BOOL)animated { }”里面站辉,重置:
[self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
//顯示 透明導航欄邊的黑邊
[self.navigationController.navigationBar setShadowImage:nil];


對于push到的界面:

根據(jù)下個界面的導航欄造型是否改變!
在下個界面的“-(void)viewWillAppear:(BOOL)animated { }”里,重新設置navigationBar背景圖片J伟殊霞!




[D]. 隱藏導航欄
  • 顯示 導航欄:
    最佳:
    [self.navigationController setNavigationBarHidden:NO animated:YES];

    不建議:
    self.navigationController.navigationBarHidden = NO;

    self.navigationController.navigationBar.hidden = NO;

    顯示導航欄 效果:
    本層:當前界面
    下一層:push到的界面



  • 隱藏 導航欄:
    最佳:
    [self.navigationController setNavigationBarHidden:YES animated:YES];

    不建議:
    self.navigationController.navigationBarHidden = YES;

    self.navigationController.navigationBar.hidden = YES;

    隱藏導航欄 效果:
    本層:當前界面
    下一層:push到的界面



使用實例

僅僅在某個視圖控制器中,隱藏navigationBar汰蓉!

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    //隱藏 navigationBar
    [self.navigationController setNavigationBarHidden:YES animated:YES];
}

-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    //顯示 navigationBar
    [self.navigationController setNavigationBarHidden:NO animated:YES];
}

效果:




[E]. 適配 導航欄

當前視圖控制器里的UIScrollView绷蹲,自動適配導航欄
self.automaticallyAdjustsScrollViewInsets = NO; //自動適配 導航欄


修改當前視圖控制器的“edgesForExtendedLayout”屬性:
self.edgesForExtendedLayout = UIRectEdgeNone; //布局 從導航欄下面開始
將“edgesForExtendedLayout”屬性 設置為UIRectEdgeNone,那么布局就是從導航欄下面開始9帕ぁH秤摇!




[F]. 背景色設置

基本格式:“setBackgroundColor:

展示例子??:
[self.navigationController.navigationBar setBackgroundColor:[UIColor blueColor]];

UIImage * Nav_BG_img = [[UIImage imageNamed:@"navgationBar_ios7"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0) resizingMode:UIImageResizingModeStretch];//圖片 自適應大小
[self.navigationController.navigationBar setBackgroundImage:Nav_BG_img forBarMetrics:UIBarMetricsDefault]; //跳轉(zhuǎn)遲鈍


背景圖片” 和 “背景色” 的區(qū)別

但是使用 設置“背景色”岩齿,需要配合設置 狀態(tài)欄顏色




barTintColor

涉及到UIVisualEffectView苞俘!


在界面跳轉(zhuǎn)時盹沈,導航欄顏色變化會有UIVisualEffectView的效果!一般不設置“setBarTintColor”吃谣。


展示例子??:
[self.navigationController.navigationBar setBarTintColor:[UIColor redColor] ];


背景圖片(backgroundImage)”乞封、“barTintColor” 和 “背景色(backgroundColor)” 的區(qū)別:

barTintColor:紅色
















goyohol's essay

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市岗憋,隨后出現(xiàn)的幾起案子肃晚,更是在濱河造成了極大的恐慌,老刑警劉巖仔戈,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件关串,死亡現(xiàn)場離奇詭異,居然都是意外死亡监徘,警方通過查閱死者的電腦和手機晋修,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凰盔,“玉大人墓卦,你說我怎么就攤上這事』Ь矗” “怎么了落剪?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長尿庐。 經(jīng)常有香客問我忠怖,道長,這世上最難降的妖魔是什么屁倔? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任脑又,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘问麸。我一直安慰自己往衷,他們只是感情好,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布严卖。 她就那樣靜靜地躺著席舍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哮笆。 梳的紋絲不亂的頭發(fā)上来颤,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機與錄音稠肘,去河邊找鬼福铅。 笑死,一個胖子當著我的面吹牛项阴,可吹牛的內(nèi)容都是我干的滑黔。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼环揽,長吁一口氣:“原來是場噩夢啊……” “哼略荡!你這毒婦竟也來了?” 一聲冷哼從身側響起歉胶,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤汛兜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后通今,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粥谬,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年衡创,在試婚紗的時候發(fā)現(xiàn)自己被綠了帝嗡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡璃氢,死狀恐怖哟玷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情一也,我是刑警寧澤巢寡,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站椰苟,受9級特大地震影響抑月,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舆蝴,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一谦絮、第九天 我趴在偏房一處隱蔽的房頂上張望题诵。 院中可真熱鬧,春花似錦层皱、人聲如沸性锭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽草冈。三九已至,卻和暖如春瓮增,著一層夾襖步出監(jiān)牢的瞬間怎棱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工绷跑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拳恋,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓你踩,卻偏偏與公主長得像诅岩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子带膜,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容